未以本地系统身份运行时,命名管道访问被拒绝

未以本地系统身份运行时,命名管道访问被拒绝

我目前正在处理一个问题,其中 WCF 应用程序创建了一个命名管道,然后由在 IIS 中运行的 asp.net 应用程序访问该管道。我没有编写 WCF 应用程序,我只是试图支持它。

应用程序在本地系统上下文中运行,而 IIS 应用程序在本地 Windows 帐户上下文中运行,该帐户是本地管理员组的成员。当 asp.net 应用程序尝试访问命名管道时,它将遇到“访问被拒绝”异常(AddressAccessDeniedException),而我不知道在哪里 :-( 这是我到目前为止为调试该问题所做的工作:

  • 在 Process Explorer 中确认命名管道确实存在并且在 WCF 应用程序启动时被创建。
  • 我通过在 Process Explorer 中搜索 BaseNamedObjects 来完成此操作,并最终确定 \BaseNamedObjects\net.pipe:Exxxxx== ...我可以确认这是我感兴趣的命名管道
  • 由于管道存在,我集中精力研究 IIS,认为这一定是权限问题。因此,我将 asp.net 应用程序改为以本地系统运行……问题就解决了
  • 切换回使用本地 Windows 帐户后,问题又出现了
  • 比较了 PE 中的工作(本地系统)和非工作(本地用户帐户)令牌……非工作令牌缺少 SeAssignPrimarytokenPrivilege
  • 我以为我们已经找到了问题的原因,但即使在修改了本地策略(并在重新启动后确认令牌具有权限)后,问题仍然存在
  • 与工作机器相比,所有其他用户权限和安全选项都没有什么不同
  • 确认 w3wp 实例正在以 Elevated 模式运行,且 UAC 已被禁用(任务管理器中的 Elevated=Yes 且 UAC Virtualization=Not Allowed)
  • 使用 AccessChk 比较非工作机器上命名管道的权限,它们与工作机器上的权限相同
  • 检查了 WCF 应用程序的清单文件,并将其与正常运行的文件进行了比较,但也没有区别

所以,我在这里...我知道管道存在,我知道这是某种权限问题,但所有权限都检查正常。我错过了什么?Windows 上是否有一些常规设置可能会阻止用户访问所有命名管道?

我知道我可以更改“匿名访问命名管道”设置,但我不想更改它,因为它没有在工作机器上配置,所以它实际上不会让我找到根本原因。我在谷歌上也看到过几次提到“远程访问命名管道”,但我不知道这是否是打字错误……命名管道不是根据其定义而本地的吗?

显然,我对此做了一些研究,并找到了一些 SO 帖子和其他博客帖子,包括下面的帖子,但它们都没有帮助我找到根本原因。

https://blogs.msdn.microsoft.com/amitlale/2007/01/29/addressaccessdeniedexception-cause-and-solution/

https://stackoverflow.com/questions/41683714/wcf-named-pipe-server-fails-with-addressaccessdeniedexception

相关内容