Использование QLocalServer поверх QtService: как установить атрибуты безопасности для именованного канала, созданного QLocalServer? - PullRequest
0 голосов
/ 17 декабря 2010

Я пытаюсь использовать QLocalServer в сервисном приложении на win7.В реализации Windows QLocalServer используются именованные каналы, и поскольку winVista пытается получить к нему доступ из графического интерфейса, возникает ошибка.Была даже ошибка QT, но тролли закрыли ее без каких-либо исправлений.Итак, мой вопрос: есть ли способ изменить атрибуты безопасности уже созданного в сервисе именованного канала, чтобы сделать его доступным из приложений графического интерфейса?Или единственный способ - скопировать объект 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 голосов
/ 27 декабря 2016

Я столкнулся с той же проблемой несколько лет назад. Возможно, это уже исправлено в последней версии 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;
}
0 голосов
/ 17 декабря 2010

если верить этому атрибуты безопасности канала не могут быть изменены пользователем LocalAdmin ... поэтому я отредактировал QLocalServer, чего я не хотел делать: (

...