在QtService上使用QLocalServer:如何将安全属性设置为QLocalServer创建的命名管道?

时间:2010-12-17 10:57:59

标签: c++ windows qt ipc named-pipes

我正在尝试在win7上的服务应用程序中使用QLocalServer。 QLocalServer的windows实现使用命名管道,因为winVista尝试从GUI访问它会导致错误。甚至有关于它的QT错误,但巨魔没有任何修复就关闭了它。 所以我的问题是: 有没有办法更改已在服务命名管道中创建的安全属性,以使其可以从gui应用程序访问? 或者唯一的方法是copypaste QT QLocalServer对象并在其代码中添加安全属性来创建管道? 我使用

授予对管道句柄的访问权限
template <class To, class From> inline To* d_ptr(From* ptr)
{
    return (To*)QObjectPrivate::get(ptr);
}
...
QLocalServerPrivate* p=d_ptr<QLocalServerPrivate>(this);

但是他们现在该怎么办?

2 个答案:

答案 0 :(得分:0)

在LocalAdmin用户下无法更改

if believe to this管道安全属性... 所以我编辑了QLocalServer,我不想这样做:(

答案 1 :(得分:0)

几年前我遇到了同样的问题。也许它已经修复了最新的Qt版本。我解决了下一个解决方法的问题:

bool fixLocalServerPermissions(QLocalServer *server)
{
    QString pipeName = server->fullServerName();

    HANDLE h = CreateNamedPipeA(pipeName.toStdString().c_str(), PIPE_ACCESS_DUPLEX | WRITE_DAC,
            PIPE_TYPE_MESSAGE, PIPE_UNLIMITED_INSTANCES, 1024*16, 1024*16, 0, NULL);

    if (h == INVALID_HANDLE_VALUE)
        return false;

    bool status = SetSecurityInfo(h, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, NULL, NULL) == ERROR_SUCCESS;
    CloseHandle(h);

    return status;
}