Aqui va una función que permite averiguarlo:
//Comprueba que el usuario que inicio el proceso sea administrador
bool UserIsAdmin(void)
{
bool bSuccess = false;
//Obetenemos el token del proceso
HANDLE hToken = NULL;
if ( !OpenProcessToken ( GetCurrentProcess ( ), TOKEN_QUERY, &hToken ) )
return false;
//Obtenemos el tamaño necesarios para la información del grupos
//asociados al token del proceso
DWORD dwSize = 0;
bSuccess = GetTokenInformation(hToken, TokenGroups, NULL, 0, &dwSize) != 0;
if( !bSuccess && ERROR_INSUFFICIENT_BUFFER != ::GetLastError() )
return false;
//Dimensionamos el buffer para los tokens de los grupos
PTOKEN_GROUPS pGroups = (PTOKEN_GROUPS) new BYTE[dwSize];
//Obtenemos la inforamción sobre los grupos
bSuccess = GetTokenInformation ( hToken, TokenGroups,
(LPVOID)pGroups, dwSize,
&dwSize ) != 0;
//Cerramos el token del proceso
CloseHandle ( hToken );
if ( !bSuccess ) return false;
//Obtenemos el sid de aministrador
SID_IDENTIFIER_AUTHORITY siaNtAuth = SECURITY_NT_AUTHORITY;
PSID pAdminSid = NULL;
if ( !AllocateAndInitializeSid ( &siaNtAuth, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0,0,0,0,0,0, &pAdminSid ) )
return false;
bSuccess = false;
//Comprobamos si el token de administrador esta entre los del
//proceso, si es asi el proceso tiene privilegios de administrador
for ( DWORD i = 0; (i < pGroups->GroupCount) && !bSuccess; i++ )
{
if ( EqualSid ( pAdminSid, pGroups->Groups[i].Sid ) )
bSuccess = true;
}
//Liberamos el sid
FreeSid ( pAdminSid );
//Liberamos la memoria
delete[] pGroups;
return bSuccess;
}
En el mundo .Net todo es más simple, aquí va el código en C# para realizar esta misma comprobación:
using System.Security.Principal;
…
//Comprueba que el usuario que inicio el proceso sea administrador
bool UserIsAdmin()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal (identity);
return principal.IsInRole (WindowsBuiltInRole.Administrator);
}