c++ - Detectar si el programa se está ejecutando con todos los derechos de administrador
winapi uac (2)
Necesito determinar si mi programa se está ejecutando con todos los derechos de administrador. Con esto quiero decir si uac está activado (para Windows Vista / 7) que necesito determinar si el programa realmente tiene derechos de administrador (como si el usuario hizo clic derecho y seleccionó "ejecutar como administrador") y no está limitado por uac. ¿Cómo hago esto en C ++?
Una expansión en la respuesta de Anders para aquellos (como yo) que saben menos de 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"));
}
- Win9x: todo el mundo es "admin"
- NT4: OpenThreadToken / OpenProcessToken + GetTokenInformation (..., TokenGroups, ...) en DOMAIN_ALIAS_RID_ADMINS SID en un bucle
- 2000+: OpenThreadToken / OpenProcessToken + CheckTokenMembership en DOMAIN_ALIAS_RID_ADMINS SID
Otras alternativas son: IsUserAnAdmin o AccessCheck
No es necesario verificar el contenido de TOKEN_ELEVATION * en el token para probar el proceso actual, pero es útil si necesita averiguar si el usuario podría elevar porque tiene un token dividido, etc.