Qt4.8.1のMicrosoftWindows7実装で次の問題が発生します。
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に設定されている場合でも、呼び出しは失敗します。では、その「アクセス拒否」エラーの原因は何でしょうか。