Umgang mit UAC

05/11/2009 - 12:37 von Michael | Report spam
Ich habe gleich mehrere schwerwiegende Probleme mit Windows Vista bzw
Windows 7 und ihrer UAC Steuerung, weshalb ich die Unterstützung
echter Profis benötige. Für jegliche Hilfe wàre ich unglaublich
dankbar, da ich selbst nach tagelangem Googeln, experimentieren und in
Büchern schmökern nicht weiter gekommen bin.


UAC Hintergrund:
==Seit Vista gibt es die sogenannte UAC Steuerung. Auf einer lokalen
Maschine hat man selbst als Administrator auf bestimmte Pfade, z.B.
%ProgramFiles% keinen Schreibzugriff, da die explorer.exe mit Standard
Benutzer Privilegien gestartet wird. Man muss den Weg über den
SecureDesktop gehen. Wenn man Standard User ist, kommt beim
SecureDesktop aber noch die Eingabefelder für eine Benutzeranmeldung,
damit man die Möglichkeit hat, sich mit einem anderen Account
Adminrechte zu verschaffen. Ansonsten bleibt einem dieser Zugriff
verwehrt.


Mein Programm:
==Ich habe ein Programm, welches sich in %ProgramFiles% (Standard User:
keine Schreibrechte) installiert. Die Installation führt ein
Systemadmin durch. Damit das Programm regelmàßig aktualisiert werden
kann, prüft das Programm auf einem Netzwerkpfad, ob eine
AutoUpdate.exe vorhanden ist und führt diese dann aus. Es handelt sich
hierbei um eine Wise Setup-Routine.

Das Programm soll prüfen, ob der angemeldete User Schreibzugriff im
Installationsverzeichnis (%ProgramFiles%) hat und wenn nicht prüfen,
ob er mit dem derzeit angemeldeten Account sich über den SecureDesktop
die Rechte überhaupt aneignen kann. Ein normaler User soll nàmlich
nicht die Meldung mit dem Secure Desktop und der Benutzeranmeldung
bekommen, sondern stattdessen nur eine Messagebox mit der Meldung,
dass ein Update vorhanden ist.

Allerdings soll der Admin in den Programmeinstellungen auch einen
Adminaccount (Domàne, Benutzername, Passwort) hinterlegen können,
welches bei Wunsch automatisch genutzt werden soll, wenn der User
nicht in der Lage ist, mit seinem eigenen Account höhere Adminrechte
anzufordern. Sprich: Standard Benutzer wird zum Adminbenutzer und
fordert dann mit SecureDesktop höhere Rechte an. Von all dem, außer
dem einmaligen Secure Desktop, soll der Benutzer nichts mit bekommen.
Ich hoffe, ich habe mich verstàndlich ausgedrückt. Ansonsten ruhig
fragen.


Probleme:
==
Problem 1:
Ich prüfe mit folgendem Befehl, ob der User Admin ist:

public bool istAdmin { get { return new WindowsPrincipal
(WindowsIdentity.GetCurrent()).IsInRole
(WindowsBuiltInRole.Administrator); } private set { } }

Doch zeigt er mir nur True an, wenn ich per SecureDesktop höhere
Adminrechte anforderte. Selbst wenn ich als lokaler Admin angemeldet
bin, würde ohne Secure Desktop nur False zurück kommen. So kann ich
also nicht effektiv prüfen, ob einer in der Lage ist, sich höhere
Adminrechte anzufordern oder nicht. Weiß da jemand rat? Vor allem weiß
ich nicht genau, wie es sich mit UAC verhàlt, wenn der Benutzer ein
Admin von einer Domàne ist. Gibt es da sowas wie ein SecureDesktop
überhaupt? Wenn nicht, dann würde meine Routine ja funktionieren.
Jedoch nicht, wenn es sich um einen lokalen Benutzer handelt.

Problem 2:
Per WindowsImpersonation (Kernel32.dll, advapi32.dll und der
WindowsIdentity Klasse) schaffe ich es, die laufende Anwendung als
jemand anders laufen zu lassen. Doch kann ich mit dieser Person keine
höhere Adminrechte anfordern (Secure Desktop), so dass das Autoupdate
mit Schreibzugriff auf %ProgramFiles% gestartet werden kann. Kann mir
einer zeigen, wie ich effektiv ein Programm als jemand anders
(Anmeldedaten werden hinterlegt) mit erhöhten Adminrechten starten
kann, damit man Schreibrechte auf %ProgramFiles% erhàlt?


viele liebe Grüße

euer hoffnungslos verzweifelter Manuel
 

Lesen sie die antworten

#1 Kerem Gümrükcü
05/11/2009 - 13:08 | Warnen spam
Hallo Michael,

langes Posting, ich versuche die Antworten
mal kurz zu halten:

1. Damit prüfst Du, ob Du effektiver Admin
bist, d.h. LinkedToken bzw. ElevatedToken:

[DllImport("advpack.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsNTAdmin(uint Reserved,
ref uint pReserved);

so rufst Du das mal auf (einmal als admin, einmal als non-admin:

uint Reserved = 0;
uint pReserved = 0;

MessageBox.Show(IsNTAdmin(Reserved,ref pReserved).ToString());

So startest Du ein Program (oder dich selber!) mit der Aufforderung
des UAC Dialogs:

//triggert den UAC Dialog, fordert für den neuen Prozess Admin
Rechte an
//und startet eine zweite instanz mit admin rechten wenn
bestàtigt

ProcessStartInfo psi = new
ProcessStartInfo(Process.GetCurrentProcess().MainModule.FileName);
psi.Verb = "runas"; //triggert den UAC Dialog

Process p = Process.Start(psi);

Das Programm soll prüfen, ob der angemeldete User Schreibzugriff im
Installationsverzeichnis (%ProgramFiles%) hat und wenn nicht prüfen,
ob er mit dem derzeit angemeldeten Account sich über den SecureDesktop
die Rechte überhaupt aneignen kann.



Zu dem Verzeichnis lesen können, d.h. ob ein benutzer darauf zugriff hat,
dazu schausst Du dir bitte mal diesen thread an, da ist auch ein gutes
beispiel:

http://www.developmentnow.com/g/36_...ssions.htm

Allerdings soll der Admin in den Programmeinstellungen auch einen
Adminaccount (Domàne, Benutzername, Passwort) hinterlegen können,
welches bei Wunsch automatisch genutzt werden soll, wenn der User
nicht in der Lage ist, mit seinem eigenen Account höhere Adminrechte
anzufordern.



Einen Benutzer kannst Du nur als Admin anlegen, also als echter Admin
und das geht so, bzw. wird hier beschrieben, darunter einige Möglichekiten,
einige echt gute, wie Du das machen kannst (Kommentare unten lesen!):

http://www.thejackol.com/2004/08/03...ount-cnet/


Das sollte Dir helfen,...

Grüße

Kerem

Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/soft...iceremover
Latest Open-Source Projects: http://entwicklung.junetz.de

Ähnliche fragen