リモートPCで動作しているプロセスにWindowsメッセージを投げることは可能でしょうか?
下記のようなコードで試してみたのですが、ASP.NETでリモートPCのプロセスを取得できています。
これらの中から目的のプロセスをプロセス名で特定し、MainWindowHandleプロパティでウィンドウハンドルを取得します。
これを利用してSendMessageで目的のウィンドウにメッセージを投げようとしていますが、pFoundWindowには0が入っています。
ちなみに目的のプロセスはAdmin権限で実行されていますが、他の権限で実行されているプロセスも同じようにウィンドウハンドルを取得できていません。
[C#]
Process[] processes = Process.GetProcesses("servername”); //プロセスリスト取得
foreach (Process p in processes)
{
if (p.ProcessName == "target_process"){ //目的のプロセスであれば
IntPtr pFoundWindow = p.MainWindowHandle; //メインウィンドウのハンドルを取得
SendMessage(pFoundWindow, msg, wParam, lParam);
}
MSDNには、MainWindowHandleはローカルPCで実行されているプロセスしか取得できないとありましたが、権限の設定等で取得できないのでしょうか?
通常、リモート接続では実行ユーザがNETWIORK SERVICEになるようですが、これをAdmin権限で実行できれば取得できそうな気がします。
これと同様のことをFindWindow関数を使ってもできるのですが、同じくリモートPCのプロセスではウィンドウハンドルを取得できません。
他に良い方法はありませんでしょうか?
サーバーはWindows Server 2003 + IIS6.0です。
No.5ベストアンサー
- 回答日時:
>間接的と言うのは仰るようにDB経由と言うことでしょうか。
そうなると、PostMessageのようにリアルタイムで通信は出来ないですよね。
DBを一定間隔でポーリングして監視するというイメージでしょうか。
正確な意味でのリアルタイムはできません。
誤差何秒まで許せるかの世界です。
SQL Server を使用すれば、SQLキャッシュ依存機能(SQLキャッシュディスペンシー)を利用するこてで、
SQL Serverじたいにポーリングをさせ、変更があれば通知させることができます。
変更通知を受けて、参照クエリを発行することで、
あたかもリアルタイムであるかのようにみせることができます。
>ASPがいったんクライアントに制御を戻して、後から結果を取りに行く
この話は、どういうことでしょうか?
クライアント側で動作するスクリプトの結果を、
送信したいということでしょうか?
そういうことであれば、AJAXの使用や、その部分をSilverlightまたはFlushにすることで、
対応できます。
Flushはよくわからないのですが。
Silverlightは非同期通信のみが可能で、
Webサービス経由での通信になります。
>サーバー側の処理に時間がかかる場合、ブラウザがリクエストを出したまま動けない状態で待たされるのは良くないのです。
これについては、別スレッドを作成して実行させればよいのです。
スレッドの実行結果が必要な場合は、
AJAXのアップデートパネルとタイマーを組み合わせることで、
簡単に実装することができると思います。
No.4
- 回答日時:
>Webアプリがサーバープロセスと(同一マシン内にあるスタンドアロンプロセスと同じように)Windowsメッセージ通信を行いたいのです。
普通にソケット通信させることはできますよ。
ASP.NETはサーバー側で動作し、
HTMLを動的に出力したりするプロセスです。
全てサーバー側での動作ですので、
サーバーないのファイルにアクセスしたり、
サーバー内のプロセスと共有メモリを張ったりできます。
>WebアプリはPageクラスから派生しているので、いわゆるウィンドウを持つ事が出来ないと思います。
HTMLページですからね、
クライアント側では、ブラウザーがウインドウハンドルを持っています。
WEBとの連携であれば。
Webページから状態を、DBに保存。
サーバープロセスからDBにアクセスし、状態を取得する。
この流れが一般的です。
他には、WEBサービスという考えもあります。
WCFを利用しRestfulなサービスを構築し、
サーバープロセスからWEBサービスにアクセスし、
データを取得するというものです。
直接通信が難しければ、
間接的な方法ではどうでしょうか?
間接的と言うのは仰るようにDB経由と言うことでしょうか。
そうなると、PostMessageのようにリアルタイムで通信は出来ないですよね。
DBを一定間隔でポーリングして監視するというイメージでしょうか。
確かにソケット通信やRPCの手段を使ってプロセス間通信は出来ると思いますが、ASPがいったんクライアントに制御を戻して、後から結果を取りに行くというような事は出来ないですよね。サーバー側の処理に時間がかかる場合、ブラウザがリクエストを出したまま動けない状態で待たされるのは良くないのです。
No.3
- 回答日時:
失礼いたしました。
ウインドウハンドルが取れないですね。
リモートPC上で、Win32APIを結局実行しなくてはいけません。
そもそもWebアプリ上でそこまでできてしまうと、
PCのっとられてしまいますね。
クライアントにもソフトウェアを配置し、
それと通信し、
クライアントソフトに実行させることで、
目的を達成することになると思います。
配布の手間が発生してしまい、
いまいちですよね。
他の方法を考えることが必要かとも思います。
どのようなことを実現したいのでしょうか?
回答ありがとうございます。
>リモートPC上で、Win32APIを結局実行しなくてはいけません。
Webアプリからターゲットアプリのウィンドウハンドルを外部ファイル経由で強引に取得し、PostMessageで通信出来ることは一応確認しています。
やりたいことは、Webアプリがサーバープロセスと(同一マシン内にあるスタンドアロンプロセスと同じように)Windowsメッセージ通信を行いたいのです。確かにセキュリティ上通常は許されないと思いますが、レガシー資産を可能な限り流用するためです。
WebアプリはPageクラスから派生しているので、いわゆるウィンドウを持つ事が出来ないと思います。そうすると別プロセスの実行結果をリアルタイムに知る方法は無いのでしょうか?PostMessage()のWM_COPYDATAコマンドなどで結果を受け取りたいのです。
No.2
- 回答日時:
WMIでは試してみましたか?
もしかしたらできるかもしれませんよ。
System.Diagnostics.Processよりも、
多くの情報が入っています。
起動パラメータなんかも、
WMIからは取得できたりします。
ぜひ確認してみてください。
C#でのWMI使用方法のサンプル
http://uchukamen.spaces.live.com/blog/cns!7CB203 …
VB.NETリモート接続のサンプル
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
回答ありがとうございます。
なるほど、こんな技もあったのですね。
Win32_ProcessからプロセスIDは取得できます。ここからSendMessageするためにはメインウィンドウハンドルが必要ですが、プロセスIDから取得できるのでしょうか?
No.1
- 回答日時:
リモートPCのプロセスを取得できたとしても、ActiveDirectoryなどで同一DomainModelのセキュリティバンウンダリを形成しているユーザ間でないと、ドメインセキュリティモデルにひっかかって、接続できないと思われます。
また、この分野は日々、セキュリティ設定が厳しくなっているものなので、異プロセス間メッセージであれば、DCOMやCORBAのような手法が定番ではないかと思います。
ただ、.NET Frameworkでしたら、.NET Remoting(.NET 1.0~)とか、WCF(.NET 3.0~)などの非常に洗練されたプロセス間メッセージングスキームがありますので、こちらを使われたほうがずっと楽で安定、高速なものが実現できると思われます。
自分は異プロセス間通信に.NET Remotingを使っています。
外していたらすみません。
参考URL:http://msdn.microsoft.com/ja-jp/library/ms973864 …
回答ありがとうございます。
NET Remotingは知っていましたが、Webアプリケーションはクライアントからアクセスされた時に動的にプロセスが生成され、セッションが終わるとともに消えるイメージなので、常にプロセスが動いていることが前提のNET Remotingによるプロセス間通信は使えるのかよく分かりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら…
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
プロセスIDからウィンドウハンドルを取得する方法
C言語・C++・C#
-
リモートデスクトップの中のウィンドウのハンドル取得
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
C++でシェルを起動
-
プロセスIDの取得方法について
-
VB.NET 自プログラムのプロセス...
-
C#でのbatファイル実行結果取得
-
Visual C++からpingを実行して...
-
共有メモリの同時アクセスにつ...
-
プロセスハンドル or ウインド...
-
起動しているプロセスの確認
-
Linuxでのスレッド間メッセージ...
-
プロセスのアタッチ・デタッチ...
-
起動中の他のプログラム(orプ...
-
SendMessageが失敗するときがある
-
パソコンが急におもくなりまし...
-
ソケットを使った通信
-
タスクマネージャーのプロセス...
-
プロセス終了の検知について
-
セマフォとmutexの違いは?
-
Windowsでのfork方法
-
共有メモリの使い方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
タスクマネージャーのプロセス...
-
explorer.exeが異様にメモリを食う
-
プロセスのアタッチ・デタッチ...
-
C#でのbatファイル実行結果取得
-
プロセスIDからウィンドウハ...
-
VB6.0 SHELLで起動...
-
非表示になったエクセルは?
-
SendMessageが失敗するときがある
-
ADOでアクセスのレコードに...
-
c言語でプロセスIDを調べたい
-
Process.Startの戻り値を後で取得
-
OSPFでプロセスを分ける意義に...
-
セマフォとmutexの違いは?
-
Visual C++からpingを実行して...
-
プロセスIDの取得方法について
-
Linuxでのスレッド間メッセージ...
-
怪しいプロセス教えてください。
-
ウィンドウのタイトルからプロ...
-
別のプロセスの関数を呼び出す...
おすすめ情報