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);
}
Je, je. La parte .NET me suena muuuuuuuuucho.
Tendrías que poner un dia un post sobre la cantidad de código que tienes que escribir en diferentes lenguajes para hacer lo mismo…
Si alguien quiere probarlo, que trate de enviar un SMS con las API nativas de Windows Mobile y despues que lo haga en CF 2.0 con WM 5.0 de unas 20 lineas en C++ a 2 con .NET
Pues aqui (http://shootout.alioth.debian.org/gp4/index.php) puedes ver una comparativa de lineas de codigo y de perfomance en algunos lenguajes ….
aunq solo se usa el Fwk.Net de Mono :s
Saludos