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