Ich habe einige Fragen bezüglich der UAC und der Erhöhung von Rechten gelesen, aber ich habe keine befriedigende / umfassende Antwort gefunden.
Ich habe dieses Szenario: Unter Windows 6 oder höher, wenn der Benutzer ein Konfigurationsfenster öffnet, muss ich den Schild ( BCM_SETSHIELD
) auf der Schaltfläche OK nur zeigen, wenn eine Erhöhung der Rechte erforderlich ist um die Aufgabe abzuschließen. - 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 diese Bedingung entworfen, um das Symbol zu zeigen:
TOKEN_ELEVATION_TYPE == TokenElevationTypeLimited
Die Bedingung # 1 ist einfach: Wenn der Benutzer keine Administratorrechte hat, ist unabhängig von der UAC immer eine Erhöhung erforderlich. # 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 wohlbekanntes Muster in Bezug auf dieses Thema?
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 es, wenn die UAC deaktiviert ist.)
Die gute Nachricht ist, dass wenn jemand in der Administratorgruppe (unter UAC) eine Anwendung nicht erhöht ausführt, Sie false
zurückbekommen, wenn Sie fragen, ob sie ein Administrator sind oder nicht. Ich denke also, dass Sie mit diesem einen Test zufrieden sein könnten.
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 nie eine Erhöhung erforderlich ist. UAC kann unter
ausgeschaltet werden %Vor% setzt den Schlüssel " EnableLUA
". 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 die Eingabeaufforderung "NO UAC" wird angezeigt.
Diese Einstellung wird unter dem gleichen Registrierungspfad im Schlüssel " ConsentPromptBehaviorAdmin
" 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 deaktiviert ist)
Woher wissen Sie, ob Ihr Prozess erhöht ausgeführt wird:
Rufen Sie OpenProcess()
, dann OpenProcessToken()
und dann GetTokenInformation(TokenElevation)
auf.
Um den Integritätslevel aufzurufen, rufen Sie GetTokenInformation(TokenIntegrityLevel)
und dann GetSidSubAuthority()
Wenn Sie also Ihr Icon nur dann zeigen möchten, wenn eine Erhöhung wirklich erforderlich ist, müssen Sie überprüfen, ob Ihr Prozess erhöht ausgeführt wird und zusätzlich diese Registrierungsschlüssel überprüfen und Sie müssen wissen, ob der Benutzer ein Administrator ist oder nicht. Dies betrifft mehrere Codezeilen, und ich würde dieses Symbol immer dann verwenden, wenn die -Erhöhung 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.
Tags und Links windows design-patterns uac privilege-elevation