Frage

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?

War es hilfreich?

Lösung

Dieser Registrierungsschlüssel sollte man sagen:

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

Wert EnableLUA (DWORD)

1 aktiviert / 0 oder fehlende deaktiviert

Aber das setzt voraus, dass die Rechte hat, es zu lesen.

Programmatically können Sie versuchen, den Benutzer-Token und erraten, zu lesen, wenn es ein Admin ist mit UAC ausgeführt wird aktiviert (siehe hier ). Nicht narrensicher, aber es kann funktionieren.

Das Problem hier ist eher ein „warum müssen Sie wissen“ - es auf die Antwort hat Lager. Wirklich, es gibt keine API, weil von einem O Verhalten Sicht, was zählt, ist, wenn der Benutzer ein Administrator ist oder nicht -, wie sie wählen, um sich zu schützen als admin ihr Problem ist.

Andere Tipps

Dieser Beitrag hat in C # Beispielcode zu testen, ob UAC aktiviert ist und wenn die aktuelle App erhöhte Rechte erhalten hat. Sie können den Code herunterladen und nach Bedarf interpretieren. Ebenfalls im Zusammenhang gibt es ein Beispiel, das die gleiche in C ++

zeigt

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

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

Sie wollen nicht, zu überprüfen, ob UAC aktiviert ist; das macht sagen Sie nichts.

Ich kann ein Standardbenutzer mit UAC deaktiviert werden.

Sie möchten überprüfen, ob der Benutzer mit Administratorrechten ausgeführt wird, verwendet 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;

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

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

Wenn der Wert 0 (oder nicht vorhanden), dann die UAC ausgeschaltet ist. Wenn es vorhanden ist und nicht Null ist, dann UAC ist 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.

Überprüfen Sie für den Registrierungswert unter HKLM \ SOFTWARE \ Microsoft \ Windows \ Currentversion \ Policies \ System

Der EnableLUA Wert bestimmt, ob UAC aktiv ist.

Dieser Beitrag ist ziemlich alt, aber ich wollte auf dem Kommentar „Warum müssen Sie wissen“ und „Check-Token-Mitgliedschaft“ Bits.

Die Tatsache ist, dass Microsofts eigene Dokumentation sagt: „Wenn die Benutzerkontensteuerung ausgeschaltet wurde und ein Standard-Benutzer versuchen, eine Aufgabe auszuführen, die Erhebung erfordert“ wir einen Fehler liefern sollten anstelle von Knöpfen und / oder Links mit der zeigt, UAC Schild, der Versuch Elevation. Siehe http://msdn.microsoft.com/en-us/ Bibliothek / windows / desktop / aa511445.aspx nach unten hin für die Details.

Wie tun wir dies ohne eine Möglichkeit zu überprüfen, ob UAC aktiviert ist?

Überprüfen Vielleicht, ob der Benutzer mit Administratorrechten läuft das Richtige ist in diesem Fall zu tun, aber wer weiß? Die Führung, die Microsoft gibt, ist, am besten , iffy, wenn nicht nur geradezu verwirrend.

Für alle anderen, dass diese findet und sucht eine VBScript-Lösung. Hier ist, was ich mit kam zu erkennen, wenn UAC aktiviert ist und wenn ja, mein Skript mit erhöhten Rechten wiederzubeleben. setzen Sie Ihren Code nur im Körper () Funktion. Ich fand es gab Probleme mit Transportabilität zwischen XP und Windows 7, wenn ich Code geschrieben hat immer erhöhten zu starten. Mit dieser Methode ich die Erhebung umgehen, wenn es keine UAC ist. Sollte auch in berücksichtigen 2008 und über Server-Versionen, die haben UAC aktiviert ist.

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top