Определить, работает ли программа с полными правами администратора
Мне нужно определить, работает ли моя программа с полными правами администратора. Я имею в виду, что если UAC включен (для Win Vista/7), мне нужно определить, действительно ли у программы есть права администратора (например, если пользователь щелкнул правой кнопкой мыши и выбрал "Запуск от имени администратора") и не ограничен UAC. Как мне сделать это в C++?
2 ответа
- Win9x: каждый "админ"
- NT4: OpenThreadToken / OpenProcessToken + GetTokenInformation (..., TokenGroups,...) в DOMAIN_ALIAS_RID_ADMINS SID в цикле
- 2000+: OpenThreadToken / OpenProcessToken + CheckTokenMembership на DOMAIN_ALIAS_RID_ADMINS SID
Другие альтернативы: IsUserAnAdmin или AccessCheck
Проверка содержимого TOKEN_ELEVATION* в токене не требуется для тестирования текущего процесса, но она полезна, если вам необходимо выяснить, может ли пользователь повысить уровень, поскольку у него есть разделенный токен и т. Д.
Расширение ответа Андерса для тех (как я), которые менее грамотны в Windows:
BOOL isMember;
PSID administratorsGroup = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthNT =
SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&administratorsGroup))
{
throw(oops_t(GetLastError(), "AllocateAndInitializeSid"));
}
if (!CheckTokenMembership(nullptr, administratorsGroup, &isMember))
{
throw(oops_t(GetLastError(), "CheckTokenMembership"));
}
if (!isMember)
{
throw(oops_t(ERROR_ACCESS_DENIED, "Test for Admin privileges"));
}