我有连接到 NamedPipeServerStream 的 NamedPipeClientStream。他们交换了一些消息,然后 NamedPipeClientStream 关闭,而 NamedPipeServerStream 重新创建并继续监听客户端管道。 (我无法制作一个工作的异步服务器管道,所以这是某种狗钉)
在我的客户端从正常用户 session 启动的流期间,客户端-服务器交互工作正常。
但在 Win7 和 win2008 服务器上,会出现客户端管道从 session 0 启动的情况。发生这种情况时,我在客户端流中出错:
"Access to the path is denied"
问题是什么?如何避免?
抱歉,我无法告诉您有关异常的更多信息。只有我有这条消息在日志中。我不能从零 session 调试我的程序,对吗?
服务器流代码:
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 服务启动的另一个应用程序启动。
最佳答案
看起来问题出在此处的安全设置中:
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);
关于c# - NamedPipeClientStream 无法访问 session 0 下的 NamedPipeServerStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13174660/