NamedPipeClientStream无法访问会话0下的NamedPipeServerStream

时间:2012-11-01 09:58:49

标签: c# windows-7 named-pipes

我有NamedPipeClientStream连接到NamedPipeServerStream。他们交换了几条消息,然后关闭NamedPipeClientStream,同时重新创建NamedPipeServerStream并继续侦听客户端管道。 (我无法使用异步服务器管道,所以这是一种狗狗指甲)

客户端 - 服务器交互在从正常用户会话启动的客户端流中正常工作。

但是有一种情况是在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服务启动的另一个应用程序启动的。

2 个答案:

答案 0 :(得分:15)

此处的问题出现在安全设置中:

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);

感谢microsoft communnity

答案 1 :(得分:0)

我知道这个问题有点老了,我刚遇到这个问题,就想加进去。

此错误也可能表明命名管道已在使用中。我的生产服务运行的是我尝试调试的可执行文件,并且初始化该管道服务器时失败了,因为它已被另一个进程使用。似乎该错误应该可以使这种情况提供更多信息,但这就是事实。