如果服务器以管理员权限运行,QLocalSocket :: connectToServer会因QLocalSocket :: SocketAccessError而失败(Windows 7)

bka*_*sbk 3 winapi qt uac named-pipes qlocalsocket

Qt 4.8.1的Microsoft Windows 7实现中出现以下问题:

QLocalServer(命名管道)正在等待客户端连接,它作为以管理权限(例如系统服务)运行的服务器应用程序运行.

如何允许非特权 QLocalSocket客户端连接到该服务器?始终拒绝连接尝试,错误代码为3(QLocalSocket :: SocketAccessError).有解决方案吗?

编辑:我发现,解决方案是通过允许完全访问"Everyone"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
}
Run Code Online (Sandbox Code Playgroud)

即使NewAcl设置为NULL,调用也会失败.那么什么可能导致"访问被拒绝"错误?

Fel*_*lix 7

我知道,现在已经有点晚了,但这可能有助于其他有同样问题的人.请注意,只有服务器是您的应用程序,此解决方案才有效.

如果是这种情况,只需在打电话之前打电话server.setSocketOptions(QLocalServer::WorldAccessOption);或其中一个其他值.QLocalServer::?SocketOptionlisten