NamedPipeClientStream 抛出 UnauthorizedAccessException:访问路径被拒绝

NamedPipeClientStream throws UnauthorizedAccessException: Access to the path is denied

我已经审查了很多类似的问题,但 none 似乎涵盖了这种情况。所以在假设它是重复的之前,请检查详细信息。

场景: 我有一个用 c# 编写的面向 .NET Framework 4.7.2 的客户端和服务器应用程序,它们分别使用 NamedPipeClientStream 和 NamedPipeServerStream 进行通信。

服务器是 运行 作为本地管理员帐户,并像这样创建 NamedPipeServerStream:

PipeSecurity ps = new PipeSecurity();
ps.AddAccessRule(new PipeAccessRule(WindowsIdentity.GetCurrent().Owner, PipeAccessRights.FullControl, AccessControlType.Allow));
ps.AddAccessRule(new PipeAccessRule(new SecurityIdentifier("S-1-5-32-544"), PipeAccessRights.ReadWrite, AccessControlType.Allow));
NamedPipeServerStream mypipe = new NamedPipeServerStream("mypipe", PipeDirection.Out, 1, 0, PipeOptions.WriteThrough, 0, 0, ps);
mypipe.WaitForConnection();

我在服务器上创建了一个名为“testuser”的本地帐户,它是本地管理员组的成员。当通过网络连接到命名管道时,此帐户用于在客户端上进行身份验证。

客户端程序 运行 作为本地用户在通过网络连接的另一台机器上创建连接,如下所示:

NamedPipeClientStream mypipe = new NamedPipeClientStream("<ip of server>", "mypipe", PipeDirection.In, PipeOptions.None);
mypipe.Connect();

当 运行 Windows Server 2012 上的服务器软件工作正常。但是在 Windows Server 2016 和 Windows Server 2019 上,我得到了 UnauthorizedAccessException。如果我通过网络使用内置管理员帐户而不是我的本地用户“testuser”进行身份验证,则它在 windows 服务器的所有三个版本上都可以正常工作。

如果我更改管道安全性以使用例如 S-1-5-11 的 SID 以允许“经过身份验证的用户”,它也适用于所有三个版本,但要求是只允许本地管理员成员组通过网络连接到服务器。理想情况下,该帐户是本地帐户还是域帐户应该无关紧要,但我只使用本地帐户进行了测试。

我在服务器上使用事件查看器进行了一些调试,我可以看到事件 5145(详细文件共享),访问管道时我的测试用户审核成功,但客户端仍然报告 UnauthorizedAccessException。

有什么方法可以限制 windows 服务器 2016 和 2019 上本地管理员组成员的访问权限吗?

如果其他人遇到这个问题,我会找到原因。 问题是“UAC 远程限制”。可以在 Microsoft 的 KB 951016

中找到更多信息

如果本地帐户是 Builtin\Administrators 组的成员并通过网络对 \remotecomputer\C$ 等 SMB 共享或命名管道进行身份验证,则该帐户不会作为“完全”管理员,因此无权访问管理资源。此类帐户必须从 RDP 等交互式登录中提升权限,才能获得完全的管理权限。因此,由于此安全功能,我使用内置帐户的方案不起作用。

似乎有三种方法可以解决这个问题。

  1. 在注册表中禁用此安全措施(可能不推荐)。
  2. 使用域帐户并将其添加为本地管理员。此安全限制似乎只影响 SAM 个(本地)帐户。
  3. 仅使用内置管理员帐户,因为它也不受安全限制的影响。

注意如果注册表编辑不当可能会造成严重后果。因此,在执行任何更改之前备份注册表。以下说明基于 Microsoft 关于该主题的文章:

要在注册表中禁用限制:

  1. 使用 regedit 和 select 以下键打开注册表: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
  2. 如果不存在则创建以下项(类型 DWORD),否则只需将其编辑为值为 1:LocalAccountTokenFilterPolicy.