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