アプリケーションが Windows Vista または Windows 7 で実行されていて、WCF NetNamedPipeBinding を使用している場合は、同じセッション内からのみアクセスできるサービスを自動的に取得します。ただし、パイプのサービス エンドを実装するプロセスが存在しない場合に限ります。 SeCreateGlobalPrivilege 特権。実際には、これは通常、サーバーが [管理者として実行] で開始されていない限り、対話型セッションで開始された任意のプログラムであることを意味します。
その理由は、潜在的なクライアントに実際のパイプ名 (GUID) を発行するために WCF が作成する名前付き共有メモリ オブジェクトに関係しています。この仕組みについてはブログで解説しています。サービス プロセスに SeCreateGlobalPrivilege がある場合、この発行オブジェクトは、すべてのセッションに表示されるグローバル カーネル名前空間に作成されます。この権限がない場合、オブジェクトは、同じセッション内でのみ表示されるローカル カーネル名前空間に作成されます。これは絶対的なセキュリティを提供しないことに注意してください。名前付きパイプ自体は、パイプ名 GUID が何らかの方法で別の方法で開示された場合、理論的には (WCF クライアント スタックではなくネイティブ API 呼び出しを使用して) 別のセッションからアクセスできます。
以前の OS をサポートする必要がある場合、またはパイプ自体に絶対的なセキュリティが必要な場合は、WCF サービス チャネル スタックがパイプを作成した後でパイプの DACL を修正して、明示的に制限を実装する必要があります。これには、標準バインディングをいじる必要があります。これを行う方法をここで示します。また、DACL で ACE を作成するための正しいログオン セッション SID を検出するために、いくつかの P/Invoke コードを記述する必要がありますが、これは特に簡単ではありません。.NET 4 では、WCF サービス スタック自体がログオン セッション SID を検出して使用し、新しいパイプ インスタンスを作成するアクセス許可を制限しますSystem.ServiceModel.Channels.SecurityDescriptorHelper.GetProcessLogonSid()
。