2008-09-11 41 views
6

Vista以前のWindowsの以前のバージョンでは、Windowsサービスが現在ログインしているデスクトップユーザーと対話して、サービスから画面上の情報を簡単に表示できるようになりました。 Windows Vistaでは、デスクトップからサービスを分離するために、セキュリティのためにセッション0が追加されました。セッション0以外で実行されているアプリケーションとサービス間の通信方法は簡単ですか?これまで私はTCP/IPを使ってこの2つの間で通信することでこの問題を解決しましたが、それを行うにはちょっとした方法のようです。Windows Vistaセッション0とデスクトップとの間の通信方法は?

答えて

4

共有メモリまたは名前付きパイプを使用してIPCを容易にすることができます。概念的にはこれはTCP/IPに似ていますが、未使用のポートを見つけることについて心配する必要はありません。

hereのように、すべてのセッションでアクセスできるように、作成する名前付きオブジェクトに接頭辞 "Global \"が付いていることを確認する必要があります。

AFAIKサービスがデスクトップと直接対話する方法はありません。

3

実際、セキュリティ上の理由から、「デスクトップ」と直接通信することはできません。とにかく、複数のアクティブユーザー+リモートセッションを持つマシンに居住しているとき、「デスクトップ」とは何ですか?

問題を解決する一般的な方法は、RPCメカニズム(TCP/IP、IPC、それらの1つを介した.Net Remoting Channelsなど)を介して通信するサービスアプリケーションを使用することです。そのような痛みはありますが、そのメリットは価値があると思います。

1

サービスをデスクトップに話すには、RPCメカニズムの1つに悩まされています。 .NET remotingメカニズム(IpcServerChannel)は、この目的で実装するのが難しくありません。

また、.NETを使用すると、デスクトップアプリケーションはServiceController.ExecuteCommandでサービスに直接メッセージを送信できます。これらのコマンドは、ServiceBase.OnCustomCommandを介してサービスによって受信されます。これはさらに簡単であり、サービスを制御することが唯一の要件であれば、あなたが必要とするすべてのものになります。

関連する問題