¿Cómo se si mi proceso fue lanzado con privilegios de administrador?

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);
}

Published 23/5/2006 8:00 por Rodrigo Corral
Archivado en: ,,
Comparte este post:
http://geeks.ms/blogs/rcorral/archive/2006/05/23/304.aspx

Comentarios

# re: ¿Cómo se si mi proceso fue lanzado con privilegios de administrador?

Je, je. La parte .NET me suena muuuuuuuuucho.

Tuesday, May 23, 2006 10:06 AM por RFOG

# re: ¿Cómo se si mi proceso fue lanzado con privilegios de administrador?

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

Tuesday, May 23, 2006 12:02 PM por Unai

# re: ¿Cómo se si mi proceso fue lanzado con privilegios de administrador?

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

Tuesday, May 23, 2006 5:26 PM por El Bruno