17

NamedPipeServerStream に接続する NamedPipeClientStream があります。NamedPipeServerStream が再作成され、クライアント パイプのリッスンを続行している間、それらはいくつかのメッセージを交換し、次に NamedPipeClientStream を閉じます。(動作する非同期サーバー パイプを作成できなかったので、これは犬の爪のようなものです)

通常のユーザー セッションからクライアントのストリームが起動されている間、クライアントとサーバーのやり取りは正常に機能します。

ただし、クライアント パイプが Win7 および win2008 サーバーのセッション 0 から起動される場合があります。これが発生すると、クライアント ストリームでエラーが発生しました。

「パスへのアクセスが拒否されました」

何が問題ですか?それを避ける方法は?

申し訳ありませんが、例外について詳しく説明することはできません。このメッセージがログに記録されているのは私だけです。また、プログラムをゼロ セッションからデバッグすることはできませんか?

サーバー ストリーム コード:

PipeSecurity ps = new PipeSecurity();
System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.BuiltinUsersSid, null);
PipeAccessRule par = new PipeAccessRule(sid, PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow);
ps.AddAccessRule(par);
pipeClientConnection = new NamedPipeServerStream(General.PIPENAME, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, General.BUFFERSIZE, General.BUFFERSIZE, ps);
Console.Write("Waiting for client connection...");
IAsyncResult result = pipeClientConnection.BeginWaitForConnection(OnPipeConnected, pipeClientConnection);

セキュリティ設定に何か問題があるのでしょうか?

そしてクライアントコード:

using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(".", General.PIPENAME, PipeDirection.InOut))
{
    try
    {
        Console.WriteLine("Connecting with pipe...");
        pipeStream.Connect(General.CONNECTIONTIMEOUT);
        Console.WriteLine("Pipe connection established");
        //..do something..
    }
    //...
}

サーバーは、LocalSystem の下で Windows サービスとして起動されます。クライアント - シンプルなコンソール アプリケーションです。LocalSystem サービスから起動された別のアプリケーションによって起動されます。

4

2 に答える 2

18

問題はここのセキュリティ設定にあったようです:

System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.BuiltinUsersSid, null);

する必要があります:

System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.WorldSid, null);

マイクロソフト コミュニティに感謝します

于 2012-11-01T13:22:01.383 に答える