![未以本地系统身份运行时,命名管道访问被拒绝](https://linux22.com/image/702804/%E6%9C%AA%E4%BB%A5%E6%9C%AC%E5%9C%B0%E7%B3%BB%E7%BB%9F%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C%E6%97%B6%EF%BC%8C%E5%91%BD%E5%90%8D%E7%AE%A1%E9%81%93%E8%AE%BF%E9%97%AE%E8%A2%AB%E6%8B%92%E7%BB%9D.png)
我目前正在处理一个问题,其中 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 帖子和其他博客帖子,包括下面的帖子,但它们都没有帮助我找到根本原因。