2009-02-24 24 views
6

¿Cómo puedo comprobar si un usuario tiene privilegios de administrador local en Win32 de C++¿Cómo puedo comprobar si un usuario tiene privilegios de administrador local en Win32

+0

Dupe? http://stackoverflow.com/questions/560366/detect-if-running-with-administrator-privileges-under-windows-xp Las respuestas apuntan a soluciones de api win32. – Anonymous

+3

No es exactamente lo mismo con UAC en Vista. "Ejecutar con privilegios de administrador" ahora implica que el usuario tiene derechos de administrador y los usó al iniciar un proceso. – MSalters

Respuesta

8

acaba de encontrar IsUserAnAdmin() en SHLOBJ.H el que hace el trabajo para mí.

+0

Ser un administrador no significa que el proceso actual se ejecuta con privilegios elevados –

+0

Precaución: IsUserAnAdmin() está en desuso: "Puede estar alterado o no disponible en versiones posteriores". Última versión de cliente compatible: Windows Vista! –

+0

oli afortunadamente solo lo necesitaba para soporte de XP, para Vista y más tarde puedo verificar la elevación. –

3

Es posible que necesite más que eso para hacer frente a la elevación y cosas semejantes ...

lo hago como esto ....

bool CProcessToken::IsUserAnAdmin() const 
{ 
#if _WIN32_WINNT >= 0x0600 

    bool isAdmin = false; 

    DWORD bytesUsed = 0; 

    TOKEN_ELEVATION_TYPE tokenElevationType; 

    if (!::GetTokenInformation(m_hToken, TokenElevationType, &tokenElevationType, sizeof(tokenElevationType), &bytesUsed)) 
    { 
     const DWORD lastError = ::GetLastError(); 

     throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - GetTokenInformation - TokenElevationType"), lastError); 
    } 

    if (tokenElevationType == TokenElevationTypeLimited) 
    { 
     CSmartHandle hUnfilteredToken; 

     if (!::GetTokenInformation(m_hToken, TokenLinkedToken, reinterpret_cast<void *>(hUnfilteredToken.GetHandle()), sizeof(HANDLE), &bytesUsed)) 
     { 
     const DWORD lastError = ::GetLastError(); 

     throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - GetTokenInformation - TokenLinkedToken"), lastError); 
     } 

     BYTE adminSID[SECURITY_MAX_SID_SIZE]; 

     DWORD sidSize = sizeof(adminSID); 

     if (!::CreateWellKnownSid(WinBuiltinAdministratorsSid, 0, &adminSID, &sidSize)) 
     { 
     const DWORD lastError = ::GetLastError(); 

     throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - CreateWellKnownSid"), lastError); 
     } 

     BOOL isMember = FALSE; 

     if (::CheckTokenMembership(hUnfilteredToken, &adminSID, &isMember)) 
     { 
     const DWORD lastError = ::GetLastError(); 

     throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - CheckTokenMembership"), lastError); 
     } 

     isAdmin = (isMember != FALSE); 
    } 
    else 
    { 
     isAdmin = ToBool(::IsUserAnAdmin());   
    } 

    return isAdmin; 

#else 
    return ToBool(::IsUserAnAdmin());   
#endif 
} 

no recuerdo donde me dieron la información de escribir ese bit de código ...

+1

Afortunadamente, puedo ignorar la elevación en este momento, ya que solicito elevación en el manifiesto, esto es solo para instalaciones anteriores a Vista. –

+0

@Len Holgate, ¿sabe si esto también funciona para los miembros de un administrador de dominio (no solo para los administradores locales de máquinas, que verifiqué que está funcionando bien) – OSH

+0

No tengo idea, lo siento. –

Cuestiones relacionadas