Изменить пользователя токена доступа (Token User) или запустить процесс с повышенными правами в контексте обычного пользователя - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь реализовать небольшое приложение для управления привилегиями для моего колледжа.Я пытаюсь поднять процесс в контексте самого стандартного пользователя.У меня есть учетные данные администратора. Logonuser () api для входа в систему как администратор и получения его токена.А затем используйте CreateProcessAsUser () или CreateProcessWithToken () с полученным токеном.Но проблема здесь в том, что, хотя процесс создания имеет привилегии администратора (повышенные другими словами), он выполняется в контексте пользователя с правами администратора и, следовательно, не имеет доступа ко всем сетевым папкам, доступным для обычного пользователя.Поэтому я хочу запустить процесс в контексте обычного пользователя, но с привилегиями администратора.

Итак, я узнал об этом SetTokenInformation () , где я могу изменить свойство TokenUserзнака.Таким образом, только TokenUser будет изменен на обычного пользователя, а все остальные привилегии останутся такими же, как и у пользователя с правами администратора.

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 токена невозможно изменить.

Как это исправить?или есть какой-то другой способ добиться того, что я пытаюсь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...