gpt4 book ai didi

qt - 如果服务器以管理权限运行,则 QLocalSocket::connectToServer 失败并出现 QLocalSocket::SocketAccessError (Windows 7)

转载 作者:行者123 更新时间:2023-12-02 01:13:43 35 4
gpt4 key购买 nike

在 Microsoft 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,调用也会失败。那么什么可能导致“访问被拒绝”错误呢?

最佳答案

我知道,现在有点晚了,但这可能会帮助其他遇到同样问题的人。请注意,只有当服务器是您的应用程序时,此解决方案才有效。

如果是这种情况,只需调用 server.setSocketOptions(QLocalServer::WorldAccessOption);QLocalServer::​SocketOption 的其他值之一在您调用 listen 之前.

关于qt - 如果服务器以管理权限运行,则 QLocalSocket::connectToServer 失败并出现 QLocalSocket::SocketAccessError (Windows 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10719487/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com