2010-06-26 9 views
8

Ich habe einige Fragen bezüglich UAC und Privilegienerhöhung gelesen, aber ich habe keine befriedigende/umfassende Antwort gefunden.UAC und Erhebungsaufforderung Muster

Ich habe dieses Szenario: unter Windows 6 oder höher, wenn der Benutzer eine Fensterkonfiguration öffnet ich den Schirm zeigen (BCM_SETSHIELD) auf der Schaltfläche OK nur wenn Erhöhung von Berechtigungen wird die Aufgabe abzuschließen, erforderlich. - Ich weiß, dass in der Windows-Benutzeroberfläche der Schild immer für "administrative Aufgaben" angezeigt wird, auch wenn UAC deaktiviert ist, aber der Kunde hatte diese spezifische Anfrage.

Ich habe Entwurf diese Bedingung, um zeigen das Symbol:

  1. Der Benutzer hat nicht administrative Rechte
    OR
  2. Der aktuelle Prozess hat TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited

Die Bedingung # 1 ist einfach: wenn der Benutzer keine Administratorrechte besitzt n ist immer erforderlich, unabhängig von der UAC. # 2 bedeutet, dass der Benutzer über Administratorrechte verfügt und jeder andere Wert von TOKEN_ELEVATION_TYPE bedeutet, dass keine Erhöhung erforderlich ist.

Ist das wirklich so einfach? Ich vermisse etwas? Und - gibt es ein dokumentiertes oder bekanntes Muster in Bezug auf dieses Thema?

+1

Dies ist eine gut geschriebene Frage, wenn ich eine gesehen habe. – badp

+0

@badp: Ich habe darüber nachgedacht und recherchiert, aber es verwirrt mich immer noch, da es zu einfach scheint ... vielleicht habe ich einige Randbedingungen nicht berücksichtigt. – Wizard79

Antwort

3

Sie haben Recht. Die meisten Leute setzen einfach den Schild auf, wenn der Button erhöht wird, aber das Richtige ist, den Schild zu setzen, wenn der Button erhöht wird (dh ihn unterdrücken, wenn du bereits erhöht bist, da alles, was du startest, erhöht bleibt) es sei denn, Sie gehen zu einem Problem, um einen nicht erhöhten Prozess zu starten, und unterdrücken, wenn UAC deaktiviert ist.)

Die gute Nachricht ist, dass wenn jemand in der Gruppe Administratoren (unter UAC) eine Anwendung nicht erhöht, Sie ' Ich werde zurück false, wenn Sie fragen, ob sie ein Administrator sind oder nicht. Also denke ich, dass du mit diesem einen Test okay sein kannst.

+1

Nun, eigentlich gibt es einen Grund, den Schild zu setzen, selbst wenn die Anwendung bereits erhöht ist (oder wenn UAC deaktiviert ist): Auf diese Weise wird der Benutzer sofort bestätigen, dass der Knopf "administrative Sachen" macht. Ich unterstütze diesen UI-Stil, aber der Kunde nicht. – Wizard79

+0

Also meinst du, dass ich mich nur auf den # 1-Check verlassen kann? – Wizard79

+0

Ich denke, Sie sollten es als "Wenn Sie kein Administrator sind, setzen Sie den Schild" und dann führen Sie alle Ihre Testfälle, um zu sehen, ob es ausreicht. Mein Verdacht ist, dass es so sein wird. –

2

Ich sehe, dass es eine Menge Verwirrung über dieses Thema gibt und die Antwort von Kate hier ist nicht korrekt und unvollständig.

Seit Vista kann ein Admin angemeldet sein, aber seine Prozesse laufen nicht automatisch hoch. Ein Admin hat ein sogenanntes "Split Token". Dies bedeutet, dass möglicherweise Prozesse für den Benutzer SAME admin ausgeführt werden, von denen einige auf Hochebene ausgeführt werden und andere nicht auf Hochebene ausgeführt werden. Wenn ein Administrator einen nicht erhöhten Prozess ausführt, wurden einige der Berechtigungen seines Tokens entfernt. Es ist nicht mehr wie in XP, wo ALLE Prozesse entweder erhöht oder nicht erhöht ausgeführt werden.

Installieren Sie Process Explorer von www.sysinternals.com und aktivieren Sie die Spalte "Integrity Level". Wenn Sie dort "Mittel" sehen, wird dieser Prozess nicht erhöht ausgeführt. Wenn Sie dort "High" sehen, läuft der Prozess erhöht. Wenn der Prozess mit der Integritätsstufe "Hoch" ausgeführt wird, ist keine UAC-Eingabeaufforderung erforderlich, um einen anderen erhöhten Prozess zu starten.

Wenn die Benutzerkontensteuerung vollständig deaktiviert ist, werden ALLE Prozesse "Hoch" ausgeführt, sodass keine Erhöhung erforderlich ist. UAC kann unter

HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System 

Einstellung der Taste "EnableLUA" ausgeschaltet. Das Ändern dieser Einstellung erfordert einen Neustart.

Aber es gibt einen anderen Punkt, der hier noch nicht erwähnt wurde. In der Systemsteuerung ist es möglich, "Elevate ohne Aufforderung" zu konfigurieren. Und in diesem Fall kann ein Admin-Benutzer einen erhöhten Prozess von einem anderen nicht erhöhten Prozess aus starten, und es wird KEINE UAC-Eingabeaufforderung angezeigt.

Diese Einstellung wird unter dem gleichen Registrierungspfad im Schlüssel "" für Administratoren gespeichert.

Für alle Nicht-Admin-Benutzer gibt es den Schlüssel "ConsentPromptBehaviorUser", aber dies ändert nur das Verhalten, aber die Höhe kann nicht ausgeschaltet werden. Nicht-Admins erhalten immer eine UAC-Eingabeaufforderung. (Wenn UAC nicht vollständig ausgeschaltet ist)

Wie wissen Sie, wenn Ihr Prozess erhöht läuft: Anruf OpenProcess(), dann OpenProcessToken(), dann GetTokenInformation(TokenElevation).

Und die Integrity Level Anruf erhalten GetTokenInformation(TokenIntegrityLevel) und dann GetSidSubAuthority()

Also, wenn Sie Ihr Symbol angezeigt werden soll nur, wenn Erhebung wirklich erforderlich ist, müssen Sie überprüfen, ob Ihr Prozess erhöhten läuft und zusätzlich diese Registrierungsschlüssel überprüfen und Sie müssen wissen, ob der Benutzer ein Administrator ist oder nicht. Dies betrifft mehrere Zeilen Code, und ich würde dieses Symbol immer anzeigen, wenn die Höhe erforderlich ist, um es einfach zu halten.

Bitte beachten Sie, dass die API IsUserAnAdmin() veraltet ist. Es darf seit Vista nicht mehr verwendet werden. Zu überprüfen, ob ein Benutzer zur Administratorengruppe gehört, ist jetzt viel mehr Code.