2009-02-24 10 views
6

Come posso controllare se un utente dotato di privilegi di amministratore locale in Win32 da C++Come faccio a controllare se un utente dotato di privilegi di amministratore locale in Win32

+0

Dupe? http://stackoverflow.com/questions/560366/detect-if-running-with-administrator-privileges-under-windows-xp Le risposte puntano a soluzioni API a win32. – Anonymous

+3

Non esattamente lo stesso con UAC sotto Vista. "Esecuzione con privilegi di amministratore" implica ora che l'utente ha i diritti di amministratore e li ha utilizzati all'avvio di un processo. – MSalters

risposta

8

appena trovato IsUserAnAdmin() in SHLOBJ.H che fa il lavoro per me.

+0

Essere un amministratore non significa che il processo corrente venga eseguito con privilegi elevati –

+0

Attenzione: IsUserAnAdmin() è obsoleto: "Potrebbe essere modificato o non disponibile nelle versioni successive." Ultima versione client supportata: Windows Vista! –

+0

oli fortunatamente mi serviva solo per il supporto XP, per Vista e successivamente posso controllare l'elevazione. –

3

Potrebbe essere necessario più di quello a che fare con l'elevazione e simili ...

lo faccio come questo ....

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 
} 

non mi ricordo dove ho ottenuto le informazioni da scrivere però quel pezzetto di codice ...

+1

Fortunatamente posso ignorare l'elevazione al momento in cui richiedo l'elevazione nel manifest, questo è solo per le installazioni pre Vista. –

+0

@Len Holgate sai se funziona anche per i membri di un amministratore di dominio (non solo per gli amministratori delle macchine locali, che ho verificato funzionasse correttamente) – OSH

+0

Non ho idea, mi dispiace. –

Problemi correlati