Web服务无法打开命名管道 - 访问被拒绝

时间:2008-12-04 11:57:46

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

我有一个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使用这个管道来获取服务。

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

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

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

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

谢谢, 帕特里克

3 个答案:

答案 0 :(得分:2)

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

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

我所见过的SECURITY_ATTRIBUTES最平易近人,最全面的描述是Keith Brown写的...... http://www.amazon.co.uk/gp/product/0201604426

答案 1 :(得分:2)

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

有几种选择......

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

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

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

  4. 在管道上使用非默认安全描述符,授予对Everyone(或运行应用程序的特定帐户)的写访问权限,但设置起来会更复杂。

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

答案 2 :(得分:2)

添加行:

< identity impersonate =“true”/>

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

感谢埃里克和马丁为我提供了正确方向的指示。

相关问题