我正在尝试在两个 Windows 进程之间创建一个命名管道。服务器进程在 UI 会话中以普通帐户运行。客户端进程在未知的安全上下文中运行,显然是相当受限的。
最初我打电话给
pipe = CreateNamedPipeA(MY_PIPE_NAME, PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, maxClients,
pipeChunkSize, pipeChunkSize, 0, nullptr);
即离开通行证没有SECURITY_ATTRIBUTES
。通常,这是可行的——没有安全意味着没有安全。显然,命名点不再是这种情况。来电者试过
CreateFileA(MY_PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
并返回一个GetLastError=5
,访问被拒绝。测试表明这是由于安全故障造成的;如果客户端可执行文件是在与服务器相同的 UI 会话中从测试环境运行的,则完全相同的行将成功。
合乎逻辑的解决方案是将用于的 DACL 设置为( SECURITY_WORLD_SID_AUTHORITY, KEY_ALL_ACCESS
S-1-1-0) 。这并没有解决问题。SECURITY_ATTRIBUTES
CreateNamedPipeA
“每个人都可以做任何事”剩下的唯一安全降级将是“没有任何安全性”。我该怎么做才能CreateNamedPipe
永远CreateFileA
不会因拒绝访问而失败?
安全性在这里无关紧要。PIPE_TYPE_MESSAGE
并且pipeChunkSize
已经意味着服务器可以安全地防止流氓客户端的缓冲区溢出。