我正在尝试为我的学院实现一个小的权限管理应用程序。我试图在标准用户本身的上下文中提升一个过程。我有管理员用户凭据。Logonuser() API以管理员用户身份登录并获取其令牌。然后将CreateProcessAsUser()或CreateProcessWithToken()与所获得的令牌一起使用。但这里的问题是,尽管create进程具有管理员权限(换句话说就是提升了),但它是在admini用户的上下文中运行的,因此不能访问所有共享给标准用户的网络文件夹。因此,我希望在标准用户的上下文中运行该流程,但要具有admin用户的权限。
因此,我了解了这个SetTokenInformation(),我可以在其中更改令牌的TokenUser属性。因此,TokenUser将单独更改为标准用户,而所有其他权限将与admin用户的权限保持相同。
struct STokenUser
{
TOKEN_USER* tu;
DWORD sizeOfToken;
};
STokenUser GetTokenUserFromToken(HANDLE tokenHandle)
{
STokenUser tu;
TOKEN_USER *tokenUser = NULL;
DWORD tokenSize;
DWORD sidLength;
GetTokenInformation(tokenHandle,
TokenUser,
tokenUser,
0,
&tokenSize);
if(GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
std::cout << "GetTokenInformation failed with " << GetLastError() << std::endl;
}
tokenUser = (TOKEN_USER *)malloc(tokenSize);
if (!GetTokenInformation(tokenHandle,
TokenUser,
tokenUser,
tokenSize,
&tokenSize))
{
free(tokenUser);
std::cout << "GetTokenInformation failed with " << GetLastError() << std::endl;
}
tu.tu = tokenUser;
tu.sizeOfToken = tokenSize;
return tu;
}
auto tu = GetTokenUserFromToken(hToken);
tu.tu->User.Sid = psidOfTheStandardUser;
if(!SetTokenInformation(hToken, TokenUser, &tu.tu, tu.sizeOfToken))
{
std::cout << "SetTokenInformation fails with error " << GetLastError() << std::endl;
}
字符串
我希望该进程在标准用户的上下文中以提升的权限运行。但SetTokenInformation失败,错误代码为87(表示传递的参数无效)。
我不知道我在哪里失败了。我曾在某个地方读到过,不可能更改令牌的TokenUser。
如何解决此问题?或者有没有其他的方法来实现我正在努力做的事情?
1条答案
按热度按时间o2gm4chl1#
伙计们,我也有同样的问题,请告诉我,如果你做到了。非常感谢您的光临。