2011-11-08 18 views
12

¿Cómo puedo verificar correctamente si un proceso se está ejecutando con derechos administrativos?Cómo verificar si un proceso tiene los derechos administrativos

Comprobé el IsUserAnAdim function in MSDN, pero no se recomienda, ya que podría estar alterado o no estar disponible en las versiones posteriores de Windows. En su lugar, se recomienda utilizar la función CheckTokenMembership.

Luego miré el ejemplo alternativo en MSDN de una descripción de la función CheckTokenMembership. Sin embargo, hay un comentario de Stefan Ozminski en MSDN que menciona que este ejemplo no funciona correctamente en Windows Vista si UAC está deshabilitado.

Por último, me trataron de usar el código de Stefan Ozminski de MSDN, pero determina que el proceso tiene derechos administrativos, incluso si la lanzo en virtud de un usuario normal sin los derechos administrativos en Windows 7.

+1

Si no puede mostrar ningún código aquí, al menos se podía proporcionarnos enlaces a los artículos/comentarios/código de referencia? –

+2

Ayudará a muchos de ustedes a definir con precisión lo que quiere decir con "derechos administrativos". ¿Quiere decir si se está ejecutando como usuario en el grupo de administradores? ¿Quiere decir si tiene derechos completos de UAC? –

+0

¿Has probado PrivilegeCheck API? – sarat

Respuesta

36

Esto le dirá si te estás ejecutando con privilegios elevados o no. Puede configurar el manifiesto para que se ejecute con la mayor cantidad posible si desea que se lo solicite. También hay otras maneras de preguntar a Windows a través del código de credenciales alternativas.

 
BOOL IsElevated() { 
    BOOL fRet = FALSE; 
    HANDLE hToken = NULL; 
    if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hToken)) { 
     TOKEN_ELEVATION Elevation; 
     DWORD cbSize = sizeof(TOKEN_ELEVATION); 
     if(GetTokenInformation(hToken, TokenElevation, &Elevation, sizeof(Elevation), &cbSize)) { 
      fRet = Elevation.TokenIsElevated; 
     } 
    } 
    if(hToken) { 
     CloseHandle(hToken); 
    } 
    return fRet; 
} 

Cuestiones relacionadas