如下問題QLocalSocket :: SocketAccessError(Windows 7)中:QLocalSocket :: connectToServer失敗,如果服務器使用管理權限運行在微軟Windows 7的Qt 4.8.1的實施發生
一個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
}
即使NewAcl
設置爲NULL調用失敗。那麼,什麼會導致「訪問被拒絕」錯誤?
嘗試在同一個用戶下同時運行服務器和客戶端(包括您的用戶或兩者都以管理員身份)。這可能是命名管道嚴格綁定到創建管道的用戶的問題 - 在本例中是管理員 - 因此沒有其他人可以訪問此管道。 (但我不確定Windows中命名管道的權限系統如何。) – leemes