Come rilevare se Vista UAC è abilitato?
-
01-07-2019 - |
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?
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