我在网络服务帐户下运行了一项服务。该服务只是设置一个命名管道并侦听连接:
NamedPipeServerStream listeningPipe = new NamedPipeServerStream("ourservicepipe",
PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances,
PipeTransmissionMode.Message, PipeOptions.Asynchronous);
listeningPipe.BeginWaitForConnection(OnPipeConnected, listeningPipe);
我在同一台计算机上的标准用户帐户上运行了一个应用程序。它尝试连接到服务创建的命名管道:
NamedPipeClientStream pipe = new NamedPipeClientStream(".", "ourservicepipe",
PipeDirection.InOut, PipeOptions.Asynchronous);
pipe.Connect(2000);
pipe.ReadMode = PipeTransmissionMode.Message;
当我致电Connect
时,最终会抛出InvalidOperationException
。如果我在同一个用户上运行该服务,它连接正常。如果我以管理员身份运行客户端,它连接正常。这让我相信问题在于权限,但我不知道在安装过程中需要设置哪些权限。
如何让客户端连接到服务器,而不要求客户端以管理员身份运行?
答案 0 :(得分:12)
使用默认服务DACL创建管道服务器,以便只有管理员或系统用户才能连接到管道。您需要使用适当的访问规则设置管道服务器,以使所有客户端连接成功。下面是设置访问规则以访问每个人访问管道的代码:
PipeSecurity pipeSa = new PipeSecurity();
pipeSa.SetAccessRule(new PipeAccessRule("Everyone",
PipeAccessRights.ReadWrite, AccessControlType.Allow));
listeningPipe.SetAccessControl(pipeSa);
最好只定义一组最小的用户来访问管道服务器以使其安全。
答案 1 :(得分:6)
我不允许发表评论,但我想指出dvansanth的答案是正确的,具体取决于操作系统语言。 当操作系统语言不是英语时,“Everyone”组可能不存在。
我这样解决了:
PipeSecurity pipeSa = new PipeSecurity();
pipeSa.SetAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null),
PipeAccessRights.ReadWrite, AccessControlType.Allow));
listeningPipe.SetAccessControl(pipeSa);
请注意,这是针对“经过身份验证的用户”而不是“所有人”