如何拒绝NT AUTHORITY\NETWORK对本地命名管道的访问?
你好!针对你的问题,咱们分两部分来聊,既解决权限困惑,也结合你现有的代码给出具体方案:
首先,先说说你提到的PIPE_REJECT_REMOTE_CLIENTS标志——它其实已经能直接阻止远程客户端连接你的命名管道了。当你在CreateNamedPipeW的dwPipeMode里设置这个标志时,任何来自远程计算机的连接请求都会被直接拒绝,这已经满足你“本地仅用”的核心需求。不过如果你还想从权限层面严格限制NT AUTHORITY\NETWORK的访问(相当于双重保障),那咱们就需要手动创建自定义的安全描述符。
你当前代码里的SECURITY_ATTRIBUTES用了lpSecurityDescriptor = NULL,这会让管道继承父进程的权限,并没有专门限制NETWORK账户。要实现拒绝NETWORK的访问,我们可以通过SDDL(安全描述符定义语言)快速创建对应的安全描述符,步骤如下:
1. 构造SDDL字符串定义权限规则
我们可以用这样的SDDL字符串:
它的含义拆解一下:
D:表示这是自主访问控制列表(DACL)(A;;GA;;;SY):允许SYSTEM账户拥有完全访问权限(GA代表Generic All)(A;;GA;;;BA):允许内置管理员组拥有完全访问权限(A;;GA;;;LU):允许本地用户组拥有完全访问权限(D;;GA;;;NW):拒绝NT AUTHORITY\NETWORK组的所有访问权限
2. 修改你的安全属性代码
把上面的逻辑整合到你现有的代码里,替换原来的attr.lpSecurityDescriptor = NULL部分:
SECURITY_ATTRIBUTES attr; attr.nLength = sizeof(SECURITY_ATTRIBUTES); attr.bInheritHandle = TRUE; // 创建自定义安全描述符,拒绝NETWORK访问 PSECURITY_DESCRIPTOR pSD = NULL; if (!ConvertStringSecurityDescriptorToSecurityDescriptorW( L"D:(A;;GA;;;SY)(A;;GA;;;BA)(A;;GA;;;LU)(D;;GA;;;NW)", SDDL_REVISION_1, &pSD, NULL)) { // 这里记得添加错误处理,比如用GetLastError()排查问题 } attr.lpSecurityDescriptor = pSD; // 后续调用CreateNamedPipeW的代码不变... // 使用完安全描述符后,一定要释放内存 LocalFree(pSD);
总结
- 如果你只需要阻止远程连接,
PIPE_REJECT_REMOTE_CLIENTS标志就足够用了,简单直接; - 如果你想从权限层面严格限制NETWORK账户的访问,那就加上自定义安全描述符,和管道标志配合使用,双重保障本地管道的安全性。
备注:内容来源于stack exchange,提问作者Benjamin Krausse DB
相关产品推荐
相关产品推荐

