c++ 修改访问令牌的用户(令牌用户)或运行在标准用户上下文中提升的进程

hgtggwj0  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(92)

我正在尝试为我的学院实现一个小的权限管理应用程序。我试图在标准用户本身的上下文中提升一个过程。我有管理员用户凭据。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。
如何解决此问题?或者有没有其他的方法来实现我正在努力做的事情?

o2gm4chl

o2gm4chl1#

伙计们,我也有同样的问题,请告诉我,如果你做到了。非常感谢您的光临。

相关问题