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,调用也会失败.那么什么可能导致"访问被拒绝"错误?
我知道,现在已经有点晚了,但这可能有助于其他有同样问题的人.请注意,只有服务器是您的应用程序,此解决方案才有效.
如果是这种情况,只需在打电话之前打电话server.setSocketOptions(QLocalServer::WorldAccessOption);或其中一个其他值.QLocalServer::?SocketOptionlisten