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

3 comentarios sobre “¿Cómo se si mi proceso fue lanzado con privilegios de administrador?”

  1. 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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *