【问题标题】:Web service can't open named pipe - access deniedWeb 服务无法打开命名管道 - 访问被拒绝
【发布时间】:2008-12-04 11:57:46
【问题描述】:

我有一个 C++ 服务,它为具有 NULL SECURITY_ATTRIBUTES 的客户端提供命名管道,如下所示:

hPipe = CreateNamedPipe( lpszPipename, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE, 0, NULL);

有一个 dll 使用这个管道来获取服务。

有一个使用 dll 并且工作正常的 c# GUI。

有一个 .net 网站也使用此 dll(在同一台 PC 上完全相同),但在尝试打开管道时总是被拒绝。

有人知道为什么会发生这种情况以及如何解决吗?

还有谁知道关于 SECURITY_ATTRIBUTES 的好教程,因为我还没有理解 msdn 信息。

谢谢, 帕特里克

【问题讨论】:

    标签: c# .net c++ winapi named-pipes


    【解决方案1】:

    命名管道的默认 ACL(使用空安全描述符获得的)仅授予 LocalSystem、管理员和管道的所有者/创建者的写访问权限。除非您的 Web 应用程序在其中一个帐户下运行(默认情况下不会),否则您将无法获得写入权限。 (我假设您要求读/写。)

    有几个选项...

    1. 让 Web 应用程序在与创建管道的服务相同的帐户下运行。

    2. 将 Web 应用程序配置为使用模拟,方法是在 web.config 中指定具有写入权限的特定用户,或者通过将其设置为使用 IIS 传入的用户(并从具有以下权限的用户帐户访问应用程序)写权限)。

    3. 在管道访问期间手动模拟具有写访问权限的用户(例如,使用 WindowsIdentity.Impersonate)。

    4. 在管道上使用非默认安全描述符,授予每个人(或运行应用程序的特定帐户,尽管设置起来更复杂)的写入权限。

    有一个创建简单安全描述符here的示例;你应该能够修改它以满足你的需要。

    【讨论】:

      【解决方案2】:

      检查 ASP.NET 网站上使用的身份验证类型,以及该网站的 web.config 文件中的模拟设置。很可能,ASP.NET 代码在不允许在您的计算机上创建命名管道的帐户下运行。

      您可以通过向 ASP.NET 应用程序正在使用的帐户授予更多权限,或者将该 Web 应用程序配置为使用不同的(更高权限的)帐户来解决此问题。话虽如此,您真的希望您网站的远程访问者能够创建命名管道吗?我不会教你,我想你已经考虑过了。

      我所见过的对 SECURITY_ATTRIBUTES 最平易近人、最彻底的描述是在 Keith Brown 的这本书中...http://www.amazon.co.uk/gp/product/0201604426

      【讨论】:

      • 哦,欢迎讲课。为澄清起见,Web 服务不是创建管道,而是调用一个 dll 函数来打开已由 Windows 服务创建的管道。我以为那是安全的?
      【解决方案3】:

      添加行:

      到 web.config 文件的 部分允许访问管道。我不建议其他人使用它,因为我不确定安全隐患,但它现在符合我们的要求。

      感谢 Eric 和 Martin 为我指明正确的方向。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-12
        相关资源
        最近更新 更多