Vedo che c'è molta confusione su questo argomento e la risposta di Kate qui non è corretta e incompleta.
Dal momento che Vista può accedere ad un amministratore ma i suoi processi non vengono eseguiti automaticamente in modo elevato. Un amministratore ha un cosiddetto "Split Token". Ciò significa che potrebbero esserci processi in esecuzione per l'utente amministratore SAME e alcuni di essi vengono eseguiti con privilegi elevati e altri NON vengono eseguiti elevati. Quando un amministratore esegue un processo non elevato, alcuni dei privilegi del suo token sono stati rimossi. Non è più come in XP, dove TUTTI i processi funzionano sia elevati che non elevati.
Installare Process Explorer da www.sysinternals.com e abilitare la colonna "Livello di integrità". Se vedi lì "Medio", questo processo non è elevato. Se vedi "Alto", il processo è elevato. Se il processo viene eseguito con il livello di integrità "Alto", non è richiesto alcun prompt UAC per avviare un altro processo elevato.
Quando il controllo dell'account utente è completamente disattivato, tutti i processi eseguono "Alto", quindi non è richiesta mai elevazione. UAC può essere disattivato sotto
HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System
impostando il tasto "EnableLUA
". La modifica di questa impostazione richiede il riavvio.
Ma c'è un altro punto che non è stato ancora menzionato qui. Nel Pannello di controllo è possibile configurare "Elevare senza richiesta". E in questo caso un utente amministratore può avviare un processo elevato da un altro processo non elevato e verrà visualizzato il prompt NO UAC.
Questa impostazione è memorizzata sotto lo stesso percorso di registro nella chiave "ConsentPromptBehaviorAdmin
" per gli utenti amministratori.
Per tutti gli utenti non amministratori è presente il tasto "ConsentPromptBehaviorUser
" ma questo modifica solo il comportamento, ma non è possibile disattivare l'elevazione. I non amministratori riceveranno sempre un prompt UAC. (Se UAC non è completamente spento)
Come fai a sapere se il processo viene eseguito con privilegi elevati: chiamata OpenProcess()
, quindi OpenProcessToken()
, quindi GetTokenInformation(TokenElevation)
.
E per ottenere la chiamata Integrity Level GetTokenInformation(TokenIntegrityLevel)
e poi GetSidSubAuthority()
Quindi, se si desidera visualizzare l'icona solo se l'elevazione è veramente necessario è necessario verificare se il processo viene eseguito elevata e inoltre controllare queste chiavi di registro e si deve sapere se l'utente è un amministratore o no. Ciò solleva diverse righe di codice e vorrei considerare di mostrare questa icona sempre quando l'elevazione potrebbe essere richiesta per semplificare l'operazione.
Si noti che l'API IsUserAnAdmin()
è obsoleta. Non deve più essere usato da Vista. Controllare se un utente appartiene al gruppo degli amministratori è molto più codice ora.
Questa è una domanda ben scritta, se ne ho visto uno. – badp
@badp: Ci ho pensato e studiato un po ', ma mi lascia ancora un puzzle perché sembra troppo facile ... forse non ho preso in considerazione alcune condizioni al contorno. – Wizard79