1

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

有 ac# GUI 使用 dll 并且工作正常。

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

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

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

谢谢,帕特里克

4

3 回答 3

2

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

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

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

于 2008-12-04T12:02:40.890 回答
2

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

有几个选择...

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

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

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

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

这里有一个创建简单安全描述符的示例;您应该能够对其进行修改以满足您的需要。

于 2008-12-05T01:31:56.560 回答
2

添加行:

<身份模拟=“真”/>

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

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

于 2008-12-08T16:15:03.870 回答