2010-06-26 11 views
8

Ho letto diverse domande relative a UAC e elevazione dei privilegi ma non ho trovato una risposta soddisfacente/completa.Modello prompt UAC e prospetto

ho questo scenario: su Windows 6 o superiore, quando l'utente apre una finestra di configurazione devo mostrare lo scudo (BCM_SETSHIELD) sul pulsante OK solo se privilegi più elevati sarà richiesto di completare l'operazione. - So che nell'interfaccia di Windows lo scudo è sempre visualizzato per "attività amministrative", anche se UAC è disabilitato, ma il cliente ha avuto questa specifica richiesta.

ho bozza di questa condizione, al fine di mostrare l'icona:

  1. L'utente ha non diritti amministrativi
    O
  2. L'attuale processo ha TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited

La condizione # 1 è semplice: se l'utente non ha diritti amministrativi elevatio n è sempre richiesto indipendentemente dal controllo dell'account utente. Il # 2 implica che l'utente abbia diritti amministrativi e qualsiasi altro valore di TOKEN_ELEVATION_TYPE significa che l'elevazione non è necessaria.

È davvero così semplice? Mi manca qualcosa? E - c'è un modello documentato o ben noto su questo argomento?

+1

Questa è una domanda ben scritta, se ne ho visto uno. – badp

+0

@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

risposta

3

Hai ragione. La maggior parte delle persone si limita a mettere lo scudo se il pulsante è in esecuzione elevato, ma la cosa giusta da fare è mettere lo scudo se il pulsante causerà l'innalzamento (cioè eliminarlo se si è già sopraelevati, poiché tutto ciò che si avvia rimarrà elevato a meno che non si verifichi un problema per avviare un processo non elevato e sopprimerlo se UAC è disattivato.)

La buona notizia è che se qualcuno nel gruppo Administrators esegue (sotto UAC) un'applicazione non elevata, si ' ll ritorno false quando si chiede se sono un amministratore o no. Quindi penso che potresti stare bene con quel solo test.

+1

Beh, in realtà c'è un fondamento logico nel mettere lo scudo anche se l'applicazione è già elevata (o se UAC è disabilitato): in questo modo l'utente riconoscerà immediatamente che il pulsante fa "cose ​​amministrative". Approvo questo stile dell'interfaccia utente, ma il cliente no. – Wizard79

+0

Quindi pensi di poter contare solo sul controllo numero 1? – Wizard79

+0

Penso che dovresti codificarlo come "se non sei un amministratore, metti lo scudo" e poi esegui tutti i test case per vedere se è sufficiente. Il mio sospetto è che lo farà. –

2

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.