Domanda

È necessario che la mia applicazione si comporti diversamente a seconda che Vista UAC sia abilitato o meno.In che modo la mia applicazione può rilevare lo stato dell'UAC sul computer dell'utente?

È stato utile?

Soluzione

Questa chiave di registro dovrebbe dirti:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

Valore EnableLUA (DWORD)

1 abilitato / 0 o disabile mancante

Ma ciò presuppone che tu abbia i diritti per leggerlo.

A livello di programmazione puoi provare a leggere il token dell'utente e indovinare se si tratta di un amministratore in esecuzione con UAC abilitato (vedi Qui).Non infallibile, ma potrebbe funzionare.

La questione qui è più un "perché hai bisogno di saperlo" - ha attinenza con la risposta.In realtà, non esiste un'API perché dal punto di vista del comportamento del sistema operativo, ciò che conta è se l'utente è un amministratore o meno: il modo in cui sceglie di proteggersi come amministratore è un suo problema.

Altri suggerimenti

Questo post contiene codice di esempio in C# per verificare se l'UAC è attivo e se all'app corrente sono stati concessi diritti elevati.È possibile scaricare il codice e interpretarlo secondo necessità.Inoltre collegato c'è un esempio che mostra lo stesso in C++

http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html

Il codice in quel post non si limita a leggere dal registro.Se l'UAC è abilitato, è probabile che potresti non avere i diritti per leggerlo dal registro.

Non vuoi verificare se l'UAC è abilitato;questo non ti dice niente.

Posso essere un utente standard con UAC disabilitato.

Vuoi controllare se l'utente è in esecuzione con privilegi amministrativi utilizzando CheckTokenMembership:

///This function tells us if we're running with administrative permissions.
function IsUserAdmin: Boolean;
var
    b: BOOL;
    AdministratorsGroup: PSID;
begin
    {
        This function returns true if you are currently running with 
               admin privileges.
        In Vista and later, if you are non-elevated, this function will 
               return false (you are not running with administrative privileges).
        If you *are* running elevated, then IsUserAdmin will return 
               true, as you are running with admin privileges.

        Windows provides this similar function in Shell32.IsUserAnAdmin.
               But the function is depricated, and this code is lifted from the 
               docs for CheckTokenMembership: 
               http://msdn.microsoft.com/en-us/library/aa376389.aspx
    }

    {
        Routine Description: This routine returns TRUE if the caller's
        process is a member of the Administrators local group. Caller is NOT
        expected to be impersonating anyone and is expected to be able to
        open its own process and process token.
        Arguments: None.
        Return Value:
            TRUE - Caller has Administrators local group.
            FALSE - Caller does not have Administrators local group.
    }
    b := AllocateAndInitializeSid(
            SECURITY_NT_AUTHORITY,
            2, //2 sub-authorities
            SECURITY_BUILTIN_DOMAIN_RID,    //sub-authority 0
            DOMAIN_ALIAS_RID_ADMINS,        //sub-authority 1
            0, 0, 0, 0, 0, 0,               //sub-authorities 2-7 not passed
            AdministratorsGroup);
    if (b) then
    begin
        if not CheckTokenMembership(0, AdministratorsGroup, b) then
         b := False;
        FreeSid(AdministratorsGroup);
    end;

    Result := b;
end;

Puoi farlo esaminando il valore DWORD AbilitaLUA nella seguente chiave di registro:

HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System

Se il valore è 0 (o non esiste), l'UAC è disattivato.Se è presente e diverso da zero, l'UAC è attivo:

BOOL IsUacEnabled( )
{
    LPCTSTR pszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
    LPCTSTR pszValue = _T("EnableLUA");
    DWORD dwType = 0;
    DWORD dwValue = 0;
    DWORD dwValueSize = sizeof( DWORD );

    if ( ERROR_SUCCESS != SHGetValue( HKEY_LOCAL_MACHINE, pszSubKey, pszValueOn, 
        &dwType, &dwValue, &dwValueSize) )
    {
            return FALSE;
    }

    return dwValue != 0;
} 

Tieni presente che se l'utente ha modificato lo stato dell'UAC ma non ha ancora riavviato il computer, questa funzione restituirà un risultato incoerente.

Controlla il valore del registro in HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

Il valore EnableLUA determina se l'UAC è attivo.

Questo post è piuttosto antico, ma volevo commentare le parti "perché hai bisogno di saperlo" e "controlla l'appartenenza al token".

Il fatto è che la documentazione di Microsoft dice che "Se il controllo dell'account utente è stato disattivato e un utente standard tenta di eseguire un'attività che richiede elevazione" dovremmo fornire un errore invece di mostrare pulsanti e/o collegamenti con lo scudo UAC che tentativo di elevazione.Vedere http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx verso il basso per i dettagli.

Come possiamo farlo senza un modo per verificare se l'UAC è abilitato?

Forse verificare se l'utente utilizza i privilegi di amministratore è la cosa giusta da fare in questo caso, ma chi lo sa?La guida fornita da Microsoft è: nella migliore delle ipotesi, incerto, se non addirittura confuso.

Per chiunque altro lo trovi e stia cercando una soluzione VBScript.Ecco cosa ho pensato per rilevare se l'UAC è abilitato e, in tal caso, riavviare il mio script con privilegi elevati.Basta inserire il codice nella funzione Body().Ho scoperto che c'erano problemi con la trasportabilità tra XP e Windows 7 se scrivevo il codice per avviare sempre con privilegi elevati.Usando questo metodo ignoro l'elevazione se non c'è UAC.Dovrebbero essere prese in considerazione anche le versioni del server 2008 e successive che hanno l'UAC abilitato.

On Error Resume Next
UACPath = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA"
Dim WshShell
Set WshShell = CreateObject("wscript.Shell")
UACValue = WshShell.RegRead(UACPath)
If UACValue = 1 Then
'Run Elevated
    If WScript.Arguments.length =0 Then
      Set objShell = CreateObject("Shell.Application")
      'Pass a bogus argument with leading blank space, say [ uac]
      objShell.ShellExecute "wscript.exe", Chr(34) & _
      WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1
      WScript.Quit
    Else 
        Body()
    End If
Else
Body()
End If

Function Body()
MsgBox "This is the body of the script"
End Function

Per quanto ne so, l'UAC è un'impostazione di policy per l'utente o il gruppo locale.Quindi puoi leggere questa proprietà da .Net.Mi scuso per non avere maggiori dettagli ma spero che questo aiuti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top