首页 > 解决方案 > 修改访问令牌的用户(令牌用户)或运行在标准用户上下文中提升的进程

问题描述

我正在尝试为我的大学实施一个小型权限管理应用程序。我正在尝试在标准用户本身的上下文中提升流程。我有管理员用户凭据。Logonuser() api 以管理员用户身份登录并获取它的令牌。然后使用CreateProcessAsUser()CreateProcessWithToken()获得令牌。但是这里的问题是,尽管创建过程具有管理员权限(以另一种方式提升),但它在 admini 用户的上下文中运行,因此无法访问与标准用户共享的所有网络文件夹。所以我想在标准用户的上下文中运行该过程,但具有管理员用户的权限。

所以我了解了这个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 。

如何解决这个问题?还是有其他方法可以实现我想要做的事情?

标签: c++windowssecurityprocessaccess-token

解决方案


推荐阅读