2011-09-19 14 views
5

NetNamedPipeBindingでメッセージを送信するWindowsサービスを実行しています。メッセージは、GPOによってトリガーされるクライアントアプリケーションから送信されます。サービスとクライアントを新しいサーバーにインストールしたところ、次のメッセージが表示されます。C#でNetNamedPipeBindingでEndpointNotFoundExceptionを取得しています。グローバル名前付きパイプを作成する必要があります

System.ServiceModel.EndpointNotFoundException: 
There was no endpoint listening at 
net.pipe://localhost/VOXAServices/VOXADefaultPipe that could accept the 
message. This is often caused by an incorrect address or SOAP action. 
See InnerException, if present, for more details. 

内部例外はありません。デスクトップ上のアイコンをダブルクリックしてクライアントアプリケーションを実行すると、問題なく実行されます。私は、Windowsサービスとクライアントアプリケーションの両方のコードを管理しているので、必要なものを変更することができます。しかし、これまでのところ、バインディング、契約、アドレスはすべて正しいと確信しています(デスクトップから実行するとすべて正常に動作するため)。問題はクライアントアプリケーションがGPOから実行されている必要があります。しかし、私はこのエラーの原因となる理由は考えられません。

UPDATE:

私は、MicrosoftのWebサイト上でこの本を読んで:

名前付きパイプが缶を処理し、共有メモリのセクションとして、Windowsオペレーティングシステムのカーネルは、そのような にオブジェクトであります 通信に使用します。名前付きパイプには名前があり、1つのマシン上で一方向または2つのプロセス間の通信を二重化するために使用できます。

1台のコンピュータで異なるWCFアプリケーション間で通信が必要な場合に、別のマシンの からの通信を防止したい場合は、名前付きパイプトランスポートを使用します。 の制限があります。 権限が昇格していない限り、Windowsリモートデスクトップから実行されているプロセスは が同じWindowsリモートデスクトップセッションに制限されている可能性があります。

Choosing a Transport、強調追加)

私は(非特権)ユーザーのコンテキストで実行するクライアントプロセスを必要とUACダイアログポップアップを持つことはオプションではありません。このクライアントプロセスに昇格された特権を与え、プロセスをユーザーコンテキストで実行しながら、ユーザーに特権を与えないようにしてもらえますか?

UPDATE#2:

グローバルとローカルの名前付きパイプ(Windowsセッションに)のようなものがあることが表示されます。私はWindowsサービスがローカルの名前付きパイプを作成していると私はグローバルな名前付きパイプを作成するように強制することができれば、それは私の問題を解決するだろうと思う。 (これは、私のクライアントアプリケーションが特権セッションから起動した場合でもそれを見つけることができたとしても、なぜsysinternalsの "Process Explorer"でパイプが見えないのかを説明しています)。問題は、名前付きパイプをグローバルに強制的に作成する方法(c#)を知りません(わかりません)。何か案は?

答えて

3

The mechanism by which WCF clients find WCF service NetNamedPipe endpointsには、カーネルの共有メモリオブジェクトが関係します。このオブジェクトは、クライアントに実際に使用するパイプの名前を通知するために使用されます。クライアントがサーバーと異なるログオンセッションに入る場合、この共有メモリオブジェクトは、グローバルカーネルネームスペースではなく、ローカルカーネルネームスペースでなければなりません。名前付きパイプ自体には、すべてのクライアントが参照できる単一の名前空間があります。共有メモリオブジェクトに使用するWCFの名前空間を直接制御することはできませんが、サーバーがSeCreateGlobalPrivilegeで動作するWindowsサービスであれば、グローバルカーネル名前空間になります。あなたの質問はこれが当てはまると思われるので、あなたの問題がカーネルオブジェクトの名前空間と結びついているかどうか懐疑的です。

他の二つの原因が考えられます。共有メモリオブジェクトと名前付きパイプの両方を保護

  1. のACL。これらは、NETWORK USERSグループ(SID S-1-5-2)のメンバシップを持つセキュリティコンテキストへのアクセスを常に拒否します。これにより、名前付きパイプエンドポイントへのリモートアクセスがないというWCFの保証が適用されます。

  2. Vistaまたはそれ以降で実行している場合、クライアントプロセスの必須完全性レベルは、カーネルオブジェクトの必須完全性レベル(暗黙のレベル - 中程度 - 手順は、私はあなたのクライアントプロセスは、さらに助言して実行しますGPOによって開始されているセキュリティコンテキストについて十分に知らない

必須整合性ラベル)を使用して高めるために、私はあなたがこれらの二つの可能性とポストをチェック示唆しますそれに応じてあなたの質問がさらに更新されます。

関連する問題