2008-09-18 17 views

Respuesta

18

La siguiente función C++ puede hacer eso:

HRESULT GetElevationType(__out TOKEN_ELEVATION_TYPE * ptet); 

/* 
Parameters: 

ptet 
    [out] Pointer to a variable that receives the elevation type of the current process. 

    The possible values are: 

    TokenElevationTypeDefault - This value indicates that either UAC is disabled, 
     or the process is started by a standard user (not a member of the Administrators group). 

    The following two values can be returned only if both the UAC is enabled 
    and the user is a member of the Administrator's group: 

    TokenElevationTypeFull - the process is running elevated. 

    TokenElevationTypeLimited - the process is not running elevated. 

Return Values: 

    If the function succeeds, the return value is S_OK. 
    If the function fails, the return value is E_FAIL. To get extended error information, call GetLastError(). 

Implementation: 
*/ 

HRESULT GetElevationType(__out TOKEN_ELEVATION_TYPE * ptet) 
{ 
    if (!IsVista()) 
     return E_FAIL; 

    HRESULT hResult = E_FAIL; // assume an error occurred 
    HANDLE hToken = NULL; 

    if (!::OpenProcessToken( 
       ::GetCurrentProcess(), 
       TOKEN_QUERY, 
       &hToken)) 
    { 
     return hResult; 
    } 

    DWORD dwReturnLength = 0; 

    if (::GetTokenInformation(
       hToken, 
       TokenElevationType, 
       ptet, 
       sizeof(*ptet), 
       &dwReturnLength)) 
    { 
      ASSERT(dwReturnLength == sizeof(*ptet)); 
      hResult = S_OK; 
    } 

    ::CloseHandle(hToken); 

    return hResult; 
} 
+0

Para la función IsVista (y más detalles sobre GetElevationType), consulte la publicación de blog de Andrei: http : //www.softblog.com/2008-02/vista-tools/ –

41

Para aquellos de nosotros que trabajamos en C#, en el SDK de Windows hay una aplicación "UACDemo" como parte de las "muestras Cruz Technology". Encuentran si el usuario actual es un administrador usando este método:

private bool IsAdministrator 
{ 
    get 
    { 
     WindowsIdentity wi = WindowsIdentity.GetCurrent(); 
     WindowsPrincipal wp = new WindowsPrincipal(wi); 

     return wp.IsInRole(WindowsBuiltInRole.Administrator); 
    } 
} 

(Nota: Me refactorizado el código original para ser una propiedad, en lugar de un "if")

+0

Pregunta, ¿esto hará la seguridad del dominio? (MYDOMAIN \ Administrators) ¿O solo es la seguridad local? – mattlant

+0

WindowsBuiltInRole.Administrator es el grupo de administración local – Ryan

+2

Si su cuenta de dominio es un administrador local para esa máquina, o un administrador de dominio, estará en ese grupo local de manera predeterminada, afaik. –

3

No creo que la elevación tipo es la respuesta que desea. Solo quieres saber si es elevado. Utilice TokenElevation en lugar de TokenElevationType cuando llame a GetTokenInformation. Si la estructura devuelve un valor positivo, el usuario es admin. Si es cero, el usuario tiene una elevación normal.

Aquí es una solución Delphi:

function TMyAppInfo.RunningAsAdmin: boolean; 
var 
    hToken, hProcess: THandle; 
    pTokenInformation: pointer; 
    ReturnLength: DWord; 
    TokenInformation: TTokenElevation; 
begin 
    hProcess := GetCurrentProcess; 
    try 
    if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then try 
     TokenInformation.TokenIsElevated := 0; 
     pTokenInformation := @TokenInformation; 
     GetTokenInformation(hToken, TokenElevation, pTokenInformation, sizeof(TokenInformation), ReturnLength); 
     result := (TokenInformation.TokenIsElevated > 0); 
    finally 
     CloseHandle(hToken); 
    end; 
    except 
    result := false; 
    end; 
end; 
0

Aquí es una aplicación VB6 de un cheque si un proceso (actual) es elevado

Option Explicit 

'--- for OpenProcessToken 
Private Const TOKEN_QUERY     As Long = &H8 
Private Const TokenElevation    As Long = 20 

Private Declare Function GetCurrentProcess Lib "kernel32"() As Long 
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long 
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Long, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long 
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 


Public Function IsElevated(Optional ByVal hProcess As Long) As Boolean 
    Dim hToken   As Long 
    Dim dwIsElevated As Long 
    Dim dwLength  As Long 

    If hProcess = 0 Then 
     hProcess = GetCurrentProcess() 
    End If 
    If OpenProcessToken(hProcess, TOKEN_QUERY, hToken) Then 
     If GetTokenInformation(hToken, TokenElevation, dwIsElevated, 4, dwLength) Then 
      IsElevated = (dwIsElevated <> 0) 
     End If 
     Call CloseHandle(hToken) 
    End If 
End Function 
Cuestiones relacionadas