在 Qt 4.8.1 的 Microsoft Windows 7 实现中出现以下问题:
QLocalServer(命名管道)正在等待客户端连接,它作为以管理权限运行的服务器应用程序(例如系统服务)运行。
如何允许非特权QLocalSocket 客户端连接到该服务器?连接尝试总是被拒绝,错误代码为 3 (QLocalSocket::SocketAccessError)。有解决办法吗?
编辑:正如我所发现的,解决方案是通过允许完全访问“每个人”Sid 来更改管道安全性。这里唯一的问题是,调用SetSecurityInfo
总是失败并出现“拒绝访问”错误。首先,我们必须获得一个管道句柄。由于管道已经由 Qt 创建,我们将使用CreateNamedPipe
.
HANDLE hPipe = CreateNamedPipe(
(const wchar_t *)_Server->fullServerName().utf16(), // pipe name
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, // read/write access
PIPE_TYPE_BYTE | // byte type pipe
PIPE_READMODE_BYTE | // byte-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
0, // output buffer size
0, // input buffer size
3000, // client time-out
0 // Default Security
);
// Same call to open/create pipe as in qlocalserver_win.cpp
// Code here to add/change ACEs
if (SetSecurityInfo(hPipe, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION,
0, 0, NewAcl, 0) == ERROR_SUCCESS) {
// Success
}
即使NewAcl
设置为 NULL,调用也会失败。那么什么会导致“拒绝访问”错误呢?