2008-09-18 12 views
22

Ich brauche meine Anwendung unterschiedlich zu verhalten, je nachdem, ob Vista UAC aktiviert ist oder nicht. Wie kann meine Anwendung auf dem Computer des Benutzers den Zustand der UAC erkennen?Wie zu erkennen, ob Vista UAC aktiviert ist?

+0

Können Sie erklären, warum Sie das brauchen? –

+2

Zum Beispiel habe ich eine Anwendung, die eine API zu einem externen Programm verwendet, die UAC aktiviert werden muss, um sogar zu funktionieren. Wenn UAC deaktiviert ist, möchte ich den Benutzer mit einem Dialogfenster informieren. –

Antwort

18

Schlüssel Dieser Registrierungs hilft, sollten Sie sagen:

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

Wert EnableLUA (DWORD)

1 aktiviert/0 oder deaktiviert

fehlt Aber das setzt voraus, dass habe das Recht, es zu lesen.

Programmgesteuert können Sie versuchen, das Token des Benutzers zu lesen und zu erraten, ob es sich um einen Administrator mit aktivierter Benutzerkontensteuerung handelt (siehe here). Nicht idiotensicher, aber es könnte funktionieren.

Das Problem hier ist eher ein "Warum müssen Sie wissen" - es hat Auswirkungen auf die Antwort. Wirklich, es gibt keine API, weil es aus Sicht des Betriebssystems wichtig ist, ob der Benutzer ein Administrator ist oder nicht - wie sie sich als Administrator schützen, ist ihr Problem.

+0

Dies ist ein Haken 22. Wenn UAC aktiviert ist, haben Sie wahrscheinlich keine Rechte zum Lesen. –

+0

Eine geringfügige Korrektur: Der Registrierungsschlüssel ist HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Richtlinien \ System, und EnableLUA ist ein DWORD-Wert (es ist kein Schlüssel). HTH –

+0

Sie sollten! = 0 und nicht mit 1 nach der Google Chrome-Quelle vergleichen (Anscheinend haben einige Systeme> 1 Werte) – Anders

2

prüfen für den Registrierungswert unter HKLM \ SOFTWARE \ Microsoft \ Windows \ Currentversion \ Policies \ System

Der EnableLUA Wert legt fest, ob UAC aktiv ist.

4

This post hat Beispielcode in C# zu testen, ob UAC aktiviert ist und wenn die aktuelle App hat erhöhte Rechte gegeben worden. Sie können den Code herunterladen und nach Bedarf interpretieren. Ebenfalls im Zusammenhang gibt es eine Probe, die das gleiche in C++ zeigt

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

Der Code in diesem Beitrag nicht nur aus der Registrierung gelesen. Wenn UAC aktiviert ist, stehen die Chancen sind Sie nicht Rechte, die von der Registrierung zu lesen haben.

-1

AFAIK ist UAC apolicy Einstellung auf dem lokalen Benutzer oder eine Gruppe. So können Sie diese Eigenschaft von .Net aus lesen. Sorry für die nicht mehr Details haben, aber ich hoffe, dass diese

3

Sie können es den DWORD-Wert EnableLUA in den folgenden Registrierungsschlüssel werden die Prüfung:

HKLM/Software/Microsoft/Windows/Currentversion/Policies/System

Wenn der Wert 0 (oder existiert nicht), dann ist die UAC ausgeschaltet. Wenn es vorhanden ist und nicht Null ist, dann ist UAC ON:

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; 
} 

Beachten Sie, dass, wenn der Benutzer den Zustand der UAC verändert hat, aber nicht den Computer noch neu gestartet, wird diese Funktion ein uneinheitliches Ergebnis zurück.

4

Sie möchten nicht überprüfen, ob die Benutzerkontensteuerung aktiviert ist. Das sagt dir nichts.

Ich kann ein Standardbenutzer mit deaktivierter Benutzerkontensteuerung sein.

Sie wollen if the user is running with administrative privileges using CheckTokenMembership überprüfen:

///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; 
1

Dieser Beitrag eher älter ist, aber ich wollte auf den Kommentar „Warum müssen Sie wissen“ und „Check-Token-Mitgliedschaft“ Bits.

Tatsache ist, dass Microsofts eigene Dokumentation besagt, dass "Wenn die Benutzerkontensteuerung deaktiviert wurde und ein Standardbenutzer versucht, eine Aufgabe auszuführen, die eine Erhöhung erfordert", sollten wir einen Fehler angeben, anstatt Schaltflächen und/oder Verknüpfungen anzuzeigen der UAC-Schild, der die Elevation versucht. Siehe http://msdn.microsoft.com/en-us/library/windows/desktop/aa511445.aspx nach unten für die Details.

Wie gehen wir dazu, ohne zu überprüfen, ob die UAC aktiviert ist?

Vielleicht ist es in diesem Fall richtig zu prüfen, ob der Benutzer mit Administratorrechten läuft, aber wer weiß? Die Anleitung, die Microsoft gibt, ist im besten Fall, wenn nicht gerade verwirrend.

1

Für alle anderen, die das finden und nach einer VBScript-Lösung suchen. Hier ist, was ich gefunden habe, um festzustellen, ob UAC aktiviert ist, und wenn ja, mein Skript mit erhöhten Rechten neu zu starten. Setzen Sie Ihren Code einfach in die Funktion Body(). Ich fand, dass es Probleme mit der Transportierbarkeit zwischen XP und Windows 7 gab, wenn ich Code schrieb, um immer erhöht zu starten. Mit dieser Methode umgehe ich die Höhe, wenn keine UAC vorhanden ist. Sollte auch 2008 und höher Serverversionen mit aktivierter Benutzerkontensteuerung berücksichtigen.

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 
Verwandte Themen