2008-12-04 101 views
1

我有一个C++服务,提供了一个名为管道客户提供一个NULL SECURITY_ATTRIBUTES如下:的Web服务无法打开命名管道 - 访问被拒绝

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信息呢。

感谢, 帕特里克

回答

2

命名管道(你有一个空的安全描述信息)补助金只写本地系统,管理员权限,而对于管道的所有者/创建者默认的ACL。除非您的Web应用程序正在其中一个帐户下运行(默认情况下它不会),否则您将无法获得写入权限。 (我假设你要求的读/写。)

有几个选项...

  1. 具有相同的帐户下运行,以创建该服务的Web应用程序管。

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

  3. 手动模拟与的管接入持续时间的写访问的用户(例如,与WindowsIdentity.Impersonate)。

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

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

2

入住的那种对ASP.NET网站使用验证,并在该网站的web.config文件中的模拟设置。很有可能,ASP.NET代码运行在不允许在您的机器上创建命名管道的帐户下。

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

对我所见过的SECURITY_ATTRIBUTES来说,最平易近人,最彻底的描述就是由Keith Brown编写的这本书...... http://www.amazon.co.uk/gp/product/0201604426

+0

哦,随意讲课。为了澄清,Web服务不是创建管道,而是调用一个dll函数,该函数打开已由windows服务创建的管道。我认为这将是安全的? – Patrick 2008-12-04 12:24:21

2

添加行:

<身份冒充= “真”/>

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

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