Я пытаюсь реализовать небольшое приложение для управления привилегиями для моего колледжа.Я пытаюсь поднять процесс в контексте самого стандартного пользователя.У меня есть учетные данные администратора. 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 токена невозможно изменить.
Как это исправить?или есть какой-то другой способ добиться того, что я пытаюсь сделать?