NamedPipeServerStream を使ってみた

.NET Framework 3.5 から名前付きパイプ・クラスができました。
これを試してみました。
普通にWinFormでは、簡単ジャンで感じで使えました。
WebサービスとWinFormで、アクセス拒否のエラーが発生。
Webサービス側が、NamedPipeClientStream でかつ、コンストラクタの引数がInOutのときのみ。
Webサービス側が、NamedPipeServerStream だったり、 コンストラクタの引数がInならエラーなし。
ググってみて見つけました。


//アクセス権限を取得
PipeSecurity pipeSec;
using (NamedPipeServerStream pipedServer = new NamedPipeServerStream("pipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOption.None)) {
pipeSec = pipedServer.GetAccessControl();
}
//NETWORK SERVICEに権限追加
SecurityIdentifier netSid = new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null);
pipeSec.AddAccessRule(new PipeAccessRule(netSid, PipeAccessRights.ReadWrite, AccessControl.AccessControlType.Allow));
//コンストラクタの引数にアクセス権限を渡す
NamedPipeServerStream pipedServer = new NamedPipeServerStream("pipe", PipeDirection.InOut, 10, PipeTransmissionMode.Message, PipeOption.None, 256, 256, pipeSec);

・・・・・

これを1週間ぐらいかかった。いや〜、難しいかった。
Server 側に権限をつけておく必要あり。Webサービスがアカウント NETWORK SERVICE で動くので、読み書き権限を与えておく必要がありました。
NamedPipeServerStream に SetAccessControl があるけど、これが全然ダメだった。
権限がありませんとエラーになる。
GetAccessControl メソッドがあるんだから、そのあと権限を追加して SetAccessControl すると普通思うだろ。
なぜ NamedPipeServerStream を2回使う必要があるんだろ。
MSDN に書いてほしいな。