win7/vista 下命名管道创建失败的解决

原创 2011年01月13日 14:08:00

最近写了一段windows下管道通信的代码,通过如下方式创建命名管道

HANDLE    hPipe = CreateNamedPipe(L"////.//pipe//testspipe",
        PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
        0, 1, 1024, 1024, 0, NULL);

这段代码在win xp/2003上表现良好,没有什么问题,可是到了win7上运行,就出现创建管道失败的错误。开始以为是权限的问题,后来改用administrator登录运行,问题依然存在。于是反复仔细研究,怀疑问题出在CreateNamedPipe()函数最后一个参数LPSECURITY_ATTRIBUTES 的身上,在MSDN里这样描述:

If lpSecurityAttributes is NULL, the named pipe gets a default security descriptor and the handle cannot be inherited. The ACLs in the default security descriptor for a named pipe grant full control to the LocalSystem account, administrators, and the creator owner. They also grant read access to members of the Everyone group and the anonymous account.

(如果 lpSecurityAttributes设成NULL,命名管道获得默认(default)的安全描述符,而且其句柄不能被继承。对于命名管道的默认安全级别描述符,ACLs(Access Control Lists,访问控制列表)授予本地用户、管理员、管道创建者,完全的控制权限。他们同时也给组内的所有成员和匿名成员提供了访问权限。翻译的不好,别见笑)

这也就说明,最后一个参数设置为NULL,就可以获得默认的安全描述符(default security descriptor),并且默认安全级别的命名管道允许匿名访问。之所以在XP/2003下能够创建成功,在WIN7下创建失败,是不是由于win nt6提高安全级别,导致的变化呢?

在http://msdn.microsoft.com/zh-cn/library/aa480152.aspx#XSLTsection146121120120  上,“命名管道的强化”一项,有如下内容,写得比较晦涩:

以下服务受到影响:运行 LocalService 或 NetworkService 的服务、选择使用服务 Sid 的服务以及在命名管道上使用 RPC 请求“默认”命名管道安全描述符的服务。

选 择使用服务 Sid 的服务意味着任何第三方服务在默认情况下都不会受到影响。服务 Sid 是 Windows Vista 中的一个新功能,您必须在服务配置中设置一个 DWORD 来进行选择。开发人员选择使用服务 Sid 后,将可采用新的服务强化行为进行测试。这一变化就是这些行为中的一项。

在命名管道上使用 RPC 请求“默认”命名管道安全描述符的服务意味着,如果某些 RPC 服务器因特殊需要而指定一个自定义的安全描述符,就不会看到任何变化。以下是受影响管道的列表:

(省略)

Sid是什么,不太清楚,但是有一个很明确的就是使用默认安全描述符的会受到影响,看来CreateNamedPipe最后一个参数不能给NULL,于是将创建管道的代码改为,增加了一个自定义安全描述符:

    BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
    SECURITY_ATTRIBUTES sa;

    sa.nLength = sizeof(sa);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = &sd;

    InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(&sd, TRUE, (PACL) 0, FALSE);

    hPipe = CreateNamedPipe(L"////.//pipe//testspipe",
        PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
        0, 1, 1024, 1024, 0, &sa);

 

在到win7下测试,创建命名管道果然成功了

有名管道创建成功,但是打开失败的情况

有名管道创建成功,但是打开失败的情况处理

进程间通信学习摘记

对于进程间的通信学习,主要知识点如下。 1.

命名管道在WIN7下运行出错的解决方法

用命名管道做进程通信,在WIN7下运行,本来是正常的,管道的服务器端做为服务是,在其他权限的管道客户端就不能跟服务器端正常通信了。 解决方法,在创建管道的时候增加安全描述符(CreateNamedP...
  • pvlking
  • pvlking
  • 2012年04月26日 14:19
  • 2317

目标框架framework不同对项目的影响

DLL:         背景:         开始做中谷项目时我还不知道怎么用DLL。后来看别人用才试着去学习使用。虽然现在已经会用了,但DLL的强大之处我了解的还远远不够。下面先简单说下DLL。...

Python Hook

# -*- coding: utf-8 -*- # import pythoncom import pyHook def onMouseEvent(event): # 监听鼠标事件 ...

关于cfile fopen fopen_s 在windows vista win7 win8 win 10系统盘目录创建文件失败解决方案-- fopen 创建文件失败

由于windows vista win7 win8 win 10 添加了UAC权限,所以会导致 在系统盘下 创建文件失败。返回拒绝访问错误。 解决办法如下: UAC是微软为了提高Window...

创建在 Vista/Win7 “默认程序” 中可显示的程序

在 Vista / Win7 中,有下面这个东东: 那么,这里面的程序是怎么出来的呢?Windows 是依据什么只显示这几个,不显示我们开发的程序呢? 答案在这里:[HKE...

解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离

文章来源:http://www.cnblogs.com/therock/articles/2261371.html 服务(Service)对于大家来说一定不会陌生,它是Windows 操作系统重要的...
  • daiafei
  • daiafei
  • 2015年02月06日 16:32
  • 1020

如何解决Vista或win7建立临时网络的无法Internet共享问题 .

在viasta和win7可以设置建立无线临时网络设置Internet共享,其他客户机连接到该无线局域网就可以上网。不过,通常多次建立后有时可能现在设置临时无线网络时直接显 设置成功,但下面没有Int...

解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离

在某国外大型汽车公司BI项目中,有一个子项目,需要通过大屏幕展示销售报表,程序需要自动启动和关闭。开发人员在开发过程中,发现在Win7的service中不能直接操作UI进程,调查过程中,发现如下相关资...
  • kissqw
  • kissqw
  • 2012年02月16日 14:33
  • 16221
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:win7/vista 下命名管道创建失败的解决
举报原因:
原因补充:

(最多只允许输入30个字)