C ++ Windows-以无管理员权限的用户身份通过​​服务启动进程

时间:2019-06-18 06:32:40

标签: c++ windows service impersonation elevated-privileges

我们已经实现了Windows服务,该服务以用户SYSTEM身份运行并具有管理员权限。如果我们的客户是由具有管理员权限的用户运行的,则它可以以管理员身份通过服务启动进程,而不会出现问题。该服务模拟用户并以管理员权限启动该过程。

但是现在我们需要对没有管理员权限的用户执行相同的操作。我找不到任何文档。

我们使用的代码:

我们获得了当前令牌

MyHandle Impersonator::getCurrentProcessToken() const
{
    MyHandle currentProcessToken;
    const auto returnCode = ::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, currentProcessToken);
    if (returnCode == 0 || *currentProcessToken == nullptr)
        throw EXCEPTION_STATIC(Exceptions::Windows::Impersonation, "Could not get token of current process", ::GetLastError());

    return currentProcessToken;
}

我们设置令牌特权

void Impersonator::enableTcbPrivilege() const
{
    MyHandle currentProcessToken = getCurrentProcessToken();

    TOKEN_PRIVILEGES tokenPrivilege;
    tokenPrivilege.PrivilegeCount = 1;
    tokenPrivilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!::LookupPrivilegeValueW(nullptr, SE_TCB_NAME, &tokenPrivilege.Privileges[0].Luid))
        throw EXCEPTION(Exceptions::Windows::Elevation, "Could not lookup TCB privilege UID", ::GetLastError());

    /* Documentation for AdjustTokenPrivileges() can be found in the internet archive:
     * https://web.archive.org/web/20161009182045/https://msdn.microsoft.com/en-us/library/aa375202(v=vs.85).aspx
     */
    if (!::AdjustTokenPrivileges(*currentProcessToken, FALSE, &tokenPrivilege, 0, nullptr, nullptr))
        throw EXCEPTION(Exceptions::Windows::Elevation, "Could not enable TCB privilege", ::GetLastError());
}

我们获得了链接令牌:

MyHandle UserImpersonator::getLinkedToken(MyHandle token) const
{
    TOKEN_LINKED_TOKEN linkedTokenStruct;
    DWORD returnLength = 0;
    const auto returnCode = ::GetTokenInformation(*token, TokenLinkedToken, &linkedTokenStruct, sizeof(linkedTokenStruct), &returnLength);
    MyHandle linkedToken(linkedTokenStruct.LinkedToken);
    if (returnCode == 0)
        throw EXCEPTION(Exceptions::Windows::Elevation, QString("Could not get admin token for user - error: %1").arg(QString::number(::GetLastError())), ::GetLastError());
    return linkedToken;
}

::GetTokenInformation失败,ERROR_NO_SUCH_LOGON_SESSION

我想知道我们试图实现的目标是否可能以及是否在某处进行了记录。或我们的代码中任何可能缺少某些内容或错误的提示。

0 个答案:

没有答案