简体   繁体   English

NamedPipeClientStream 在 Connect 上抛出 UnauthorizedAccessException

[英]NamedPipeClientStream throws UnauthorizedAccessException on Connect

I have the same problem everyone else has when connecting a "write" pipe to a running service: UnauthorizedAccessException.在将“写入”管道连接到正在运行的服务时,其他人都遇到了同样的问题:UnauthorizedAccessException。 I tried every solution and nothing can make it connect successfully.我尝试了所有解决方案,但没有任何方法可以使其成功连接。

The scenario is having a low-integrity C#/WPF app running in system tray that gets notifications from a Windows Service using named pipes and can tell the service to cancel certain operations or wait for more data (which is why it needs a write pipe to the service).该方案是在系统托盘中运行一个低完整性 C#/WPF 应用程序,它使用命名管道从 Windows 服务获取通知,并可以告诉服务取消某些操作或等待更多数据(这就是为什么它需要一个写管道来服务)。 Reading from service's pipe works fine, and I am using two pipe objects (one from service to client and another from client to service).从服务的管道读取工作正常,我使用了两个管道对象(一个从服务到客户端,另一个从客户端到服务)。

The service runs under a domain user's account, but the pipe fails to connect no matter what it runs under, including Local System.该服务在域用户的帐户下运行,但无论它在什么环境下运行,包括本地系统,管道都无法连接。

Server pipes are created like so:服务器管道是这样创建的:

PipeSecurity ps = new PipeSecurity();

// Production service runs under current user credentials.
ps.AddAccessRule(new PipeAccessRule(WindowsIdentity.GetCurrent().User, PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));

// Test service runs under local system credentials.
ps.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null), PipeAccessRights.ReadWrite | PipeAccessRights.CreateNewInstance, AccessControlType.Allow));

// Add world just for the hell of it, still won't work.
ps.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), PipeAccessRights.FullControl, AccessControlType.Allow));

this.readPipe = new NamedPipeServerStream(clientPipeName, PipeDirection.In);
this.writePipe = new NamedPipeServerStream(serverPipeName, PipeDirection.Out, 1, PipeTransmissionMode.Byte, PipeOptions.None, 1024, 1024, ps);

Client pipes are created like so:客户端管道是这样创建的:

this.readPipe = new NamedPipeClientStream(".", serverPipeName, PipeDirection.In);
this.writePipe = new NamedPipeClientStream(".", clientPipeName, PipeDirection.Out);

// This doesn't make a difference.
//this.writePipe = new NamedPipeClientStream(".", clientPipeName, PipeAccessRights.FullControl, PipeOptions.None, TokenImpersonationLevel.None, HandleInheritability.None);

Didn't want to leave this open, since this was solved and following code is in production.不想让这个开放,因为这已经解决了,下面的代码正在生产中。

  • Server pipe must have ACL list carefully constructed to allow connections from low-integrity client pipes, as long as users are authenticated or administrators.服务器管道必须具有精心构造的 ACL 列表,以允许来自低完整性客户端管道的连接,只要用户经过身份验证或管理员。 See CreateNativePipeSecurity().请参阅 CreateNativePipeSecurity()。
  • Client pipe is created as usual像往常一样创建客户端管道

    /// <summary> /// Creates the client and server pipes. /// </summary> private void CreatePipes() { string serverPipeName = string.Format("{0}server", this.pipeName); string clientPipeName = string.Format("{0}client", this.pipeName); if (this.readPipe != null) { this.readPipe.Dispose(); } if (this.writePipe != null) { this.writePipe.Dispose(); } if (this.server) { // Create a write pipe for sending notifications to client. this.writePipe = new NamedPipeServerStream(clientPipeName, PipeDirection.Out); // Create a read pipe for receiving notifications from the client. // Creating a pipe to high integrity process from low integrity process requires native access list creation (.NET bug). NativeMethods.SECURITY_ATTRIBUTES securityAttributes = this.CreateNativePipeSecurity(); IntPtr securityAttributesPtr = Marshal.AllocHGlobal(Marshal.SizeOf(securityAttributes)); Marshal.StructureToPtr(securityAttributes, securityAttributesPtr, false); string nativePipeName = string.Format(@"\\\\.\\pipe\\{0}", serverPipeName); SafePipeHandle nativePipe = NativeMethods.CreateNamedPipe( nativePipeName, NativeMethods.PipeOpenMode.PIPE_ACCESS_INBOUND, 0, NativeMethods.PipeInstances.PIPE_UNLIMITED_INSTANCES, 0, 0, NativeMethods.PipeWait.NMPWAIT_WAIT_FOREVER, securityAttributesPtr); int error = Marshal.GetLastWin32Error(); Marshal.FreeHGlobal(securityAttributesPtr); if (nativePipe.IsInvalid) { throw new Win32Exception(error); } this.readPipe = new NamedPipeServerStream(PipeDirection.In, false, false, nativePipe); } else { // Create a read pipe for receiving notifications from server. this.readPipe = new NamedPipeClientStream(".", clientPipeName, PipeDirection.In); // Create a write pipe for sending notifications to the server. this.writePipe = new NamedPipeClientStream(".", serverPipeName, PipeDirection.Out); } } /// <summary> /// Generate security attributes to allow low integrity process to connect to high integrity service. /// </summary> /// <returns>A structure filled with proper attributes.</returns> private NativeMethods.SECURITY_ATTRIBUTES CreateNativePipeSecurity() { // Define the SDDL for the security descriptor. string sddl = "D:" + // Discretionary ACL "(A;OICI;GRGW;;;AU)" + // Allow read/write to authenticated users "(A;OICI;GA;;;BA)"; // Allow full control to administrators IntPtr securityDescriptor = IntPtr.Zero; if (NativeMethods.ConvertStringSecurityDescriptorToSecurityDescriptor( sddl, 1, out securityDescriptor, IntPtr.Zero) == 0) { throw new Win32Exception(Marshal.GetLastWin32Error()); } NativeMethods.SECURITY_ATTRIBUTES sa = new NativeMethods.SECURITY_ATTRIBUTES(); sa.nLength = Marshal.SizeOf(sa); sa.lpSecurityDescriptor = securityDescriptor; sa.bInheritHandle = 0; return sa; }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 NamedPipeClientStream 抛出 UnauthorizedAccessException:对路径的访问被拒绝 - NamedPipeClientStream throws UnauthorizedAccessException: Access to the path is denied NamedPipeClientStream 未连接 - NamedPipeClientStream does not connect NamedPipeClientStream.Connect()抛出System.IO.FileNotFoundException:无法找到指定的文件 - NamedPipeClientStream.Connect() throws System.IO.FileNotFoundException: Unable to find the specified file 网络上的C#NamedPipe在客户端连接上引发UnauthorizedAccessException - C# NamedPipe over network throws UnauthorizedAccessException on client connect FileOpenPicker PickSingleFileAsync抛出UnauthorizedAccessException - FileOpenPicker PickSingleFileAsync throws UnauthorizedAccessException FileOpenPicker引发UnauthorizedAccessException - FileOpenPicker throws UnauthorizedAccessException 为只读命名管道启用MessageMode时的C#UnauthorizedAccessException(NamedPipeClientStream类) - C# UnauthorizedAccessException when enabling MessageMode for read-only named pipe (NamedPipeClientStream class) 谷歌 API .NET 抛出 UnauthorizedAccessException - Google API .NET Throws UnauthorizedAccessException C# 注册表 SetValue 抛出 UnauthorizedAccessException - C# Registry SetValue throws UnauthorizedAccessException ContactManager.RequestStoreAsync()抛出System.UnauthorizedAccessException - ContactManager.RequestStoreAsync() throws System.UnauthorizedAccessException
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM