dポイントプレゼントキャンペーン実施中!

リモート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です。

A 回答 (5件)

>間接的と言うのは仰るようにDB経由と言うことでしょうか。


そうなると、PostMessageのようにリアルタイムで通信は出来ないですよね。
DBを一定間隔でポーリングして監視するというイメージでしょうか。

正確な意味でのリアルタイムはできません。
誤差何秒まで許せるかの世界です。

SQL Server を使用すれば、SQLキャッシュ依存機能(SQLキャッシュディスペンシー)を利用するこてで、
SQL Serverじたいにポーリングをさせ、変更があれば通知させることができます。

変更通知を受けて、参照クエリを発行することで、
あたかもリアルタイムであるかのようにみせることができます。


>ASPがいったんクライアントに制御を戻して、後から結果を取りに行く

この話は、どういうことでしょうか?
クライアント側で動作するスクリプトの結果を、
送信したいということでしょうか?

そういうことであれば、AJAXの使用や、その部分をSilverlightまたはFlushにすることで、
対応できます。

Flushはよくわからないのですが。
Silverlightは非同期通信のみが可能で、
Webサービス経由での通信になります。



>サーバー側の処理に時間がかかる場合、ブラウザがリクエストを出したまま動けない状態で待たされるのは良くないのです。

これについては、別スレッドを作成して実行させればよいのです。

スレッドの実行結果が必要な場合は、
AJAXのアップデートパネルとタイマーを組み合わせることで、
簡単に実装することができると思います。
    • good
    • 0

>Webアプリがサーバープロセスと(同一マシン内にあるスタンドアロンプロセスと同じように)Windowsメッセージ通信を行いたいのです。



普通にソケット通信させることはできますよ。
ASP.NETはサーバー側で動作し、
HTMLを動的に出力したりするプロセスです。
全てサーバー側での動作ですので、
サーバーないのファイルにアクセスしたり、
サーバー内のプロセスと共有メモリを張ったりできます。

>WebアプリはPageクラスから派生しているので、いわゆるウィンドウを持つ事が出来ないと思います。

HTMLページですからね、
クライアント側では、ブラウザーがウインドウハンドルを持っています。



WEBとの連携であれば。
Webページから状態を、DBに保存。

サーバープロセスからDBにアクセスし、状態を取得する。

この流れが一般的です。

他には、WEBサービスという考えもあります。
WCFを利用しRestfulなサービスを構築し、
サーバープロセスからWEBサービスにアクセスし、
データを取得するというものです。

直接通信が難しければ、
間接的な方法ではどうでしょうか?
    • good
    • 0
この回答へのお礼

間接的と言うのは仰るようにDB経由と言うことでしょうか。
そうなると、PostMessageのようにリアルタイムで通信は出来ないですよね。
DBを一定間隔でポーリングして監視するというイメージでしょうか。

確かにソケット通信やRPCの手段を使ってプロセス間通信は出来ると思いますが、ASPがいったんクライアントに制御を戻して、後から結果を取りに行くというような事は出来ないですよね。サーバー側の処理に時間がかかる場合、ブラウザがリクエストを出したまま動けない状態で待たされるのは良くないのです。

お礼日時:2010/03/24 20:01

失礼いたしました。


ウインドウハンドルが取れないですね。

リモートPC上で、Win32APIを結局実行しなくてはいけません。

そもそもWebアプリ上でそこまでできてしまうと、
PCのっとられてしまいますね。

クライアントにもソフトウェアを配置し、
それと通信し、
クライアントソフトに実行させることで、
目的を達成することになると思います。

配布の手間が発生してしまい、
いまいちですよね。

他の方法を考えることが必要かとも思います。
どのようなことを実現したいのでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>リモートPC上で、Win32APIを結局実行しなくてはいけません。

Webアプリからターゲットアプリのウィンドウハンドルを外部ファイル経由で強引に取得し、PostMessageで通信出来ることは一応確認しています。
やりたいことは、Webアプリがサーバープロセスと(同一マシン内にあるスタンドアロンプロセスと同じように)Windowsメッセージ通信を行いたいのです。確かにセキュリティ上通常は許されないと思いますが、レガシー資産を可能な限り流用するためです。

WebアプリはPageクラスから派生しているので、いわゆるウィンドウを持つ事が出来ないと思います。そうすると別プロセスの実行結果をリアルタイムに知る方法は無いのでしょうか?PostMessage()のWM_COPYDATAコマンドなどで結果を受け取りたいのです。

お礼日時:2010/03/23 22:01

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 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
なるほど、こんな技もあったのですね。
Win32_ProcessからプロセスIDは取得できます。ここからSendMessageするためにはメインウィンドウハンドルが必要ですが、プロセスIDから取得できるのでしょうか?

お礼日時:2010/03/21 15:06

リモート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 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
NET Remotingは知っていましたが、Webアプリケーションはクライアントからアクセスされた時に動的にプロセスが生成され、セッションが終わるとともに消えるイメージなので、常にプロセスが動いていることが前提のNET Remotingによるプロセス間通信は使えるのかよく分かりません。

お礼日時:2010/03/21 15:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!