Windows Vista セッション 0 とデスクトップの間でどのように通信しますか?
-
09-06-2019 - |
質問
Vista より前のバージョンの Windows では、Windows サービスに現在ログインしているデスクトップ ユーザーと対話させて、サービスからの情報を画面上に簡単に表示できました。Windows Vista では、サービスをデスクトップから分離するためのセキュリティのためにセッション 0 が追加されました。サービスとセッション 0 の外部で実行されているアプリケーションの間で通信する簡単な方法は何ですか?これまでのところ、TCP/IP を使用して 2 つの間の通信を行うことでこの問題を回避してきましたが、それはちょっとずさんな方法のようです。
解決
共有メモリまたは名前付きパイプを使用して、IPC を容易にすることもできます。概念的には、これは TCP/IP に似ていますが、未使用のポートを見つけることを心配する必要はありません。
説明のように、作成する名前付きオブジェクトに「Global\」というプレフィックスが付いていることを確認して、すべてのセッションからアクセスできるようにする必要があります。 ここ.
私の知る限り、サービスがデスクトップと直接対話する方法はもうありません。
他のヒント
実際、セキュリティ上の理由から、「デスクトップ」と直接通信することはできなくなりました。複数のアクティブ ユーザーとリモート セッションが存在するマシン内で作業している場合、そもそも「デスクトップ」とは何でしょうか?
この問題を解決する一般的な方法は、何らかの RPC メカニズム (TCP/IP、IPC、これらのいずれかを介した .Net リモーティング チャネルなど) を介して通信するサービス アプリを使用することです。ちょっと面倒ですが、変更するだけの価値はあると思います。
サービスがデスクトップと通信するには、RPC メカニズムの 1 つにほぼ依存します。.NET リモート処理メカニズム (Ipcサーバーチャネル) この目的のために実装するのはそれほど難しくありません。
また、.NET を使用すると、デスクトップ アプリケーションは次のコマンドを使用してサービスにメッセージを直接送信できます。 ServiceController.ExecuteCommand. 。これらのコマンドは、次の経由でサービスによって受信されます。 ServiceBase.OnCustomCommand. 。これはさらに簡単で、サービスの制御だけが必要な場合にはこれで十分です。