Entwickler-Ecke

Windows API - Registry-Schlüssel in HKEY_LOCAL_MACHINE schreiben mit UAC


LonghornUser - Mi 21.10.09 20:35
Titel: Registry-Schlüssel in HKEY_LOCAL_MACHINE schreiben mit UAC
Hallo,

ich habe ein Problem mit der Benutzerkontensteuerung (UAC) unter Windows 7 (das wird sich aber bestimmt unter Vista genauso verhalten). Ich schreibe durch folgenden Code in die Registry:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
If IsAdmin = True then begin
    Reg:=TRegistry.Create;
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    Reg.OpenKey('Software\Test1\Test2',True);

    Reg.WriteString('Test3','1');
end;

Leider bekomme ich dann eine Fehlermeldung "Cannot write ...", welche nicht abgefangen wird, weil man ja trotzdem als Admin angemeldet ist, nur die UAC Schreibrechte entzieht.

Habt ihr eine Idee, wie ich dieses Problem beheben könnte?

Ciao LHUser

Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt


Andreas L. - Mi 21.10.09 21:00

Vielleicht klappt folgendes:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  Reg: TRegistry;
begin
  try
    Reg := TRegistry.Create(KEY_ALL_ACCESS);  //oder KEY_WRITE
  except
    //Keine Schreibrechte vorhanden, evtl. noch auf den richtigen Exception-Typ prüfen
  end;
  //Mit Reg was machen, wird nur ausgeführt wenn keine Exception aufgetreten ist
end;


LonghornUser - Mi 21.10.09 21:20

OK, das hat schon mal geklappt. Jetzt kommt kein Fehler mehr. Nur habe ich nun das Problem, dass ich den Wert in der Registry nicht mehr schreiben kann. Und wenn ich "Als Administratot ausführen" mache, kommt der Fehler auch.

Wie macht mand denn Änderungen an HKLM, wenn UAC aktiviert ist?


jaenicke - Mi 21.10.09 23:29

Dafür muss man dann Adminrechte anfordern.

Nebenbei gibts ab Vista die Funktion IsUserAnAdmin, mit der man das testen kann. Dann braucht man kein try..except...
http://msdn.microsoft.com/en-us/library/bb776463.aspx


LonghornUser - Mi 21.10.09 23:41

Das isAdmin mache ich ja schon, aber es ist in diesem Fall nicht hilfreich, weil zB. ein Admin mit UAC trotzdem ein Admin bleibt, obwohl er keine uneingeschränkten Rechte hat.

Aber der Ansatz mit dem "als Admin öffnen" sollte funktionieren. Danke für den Hinweis ;)


Delete - Do 22.10.09 00:07

Leg ein Manifest dabei, dass deine Anwendung echte Adminsitratorechte benötigt. Dann kommt schon beim Start die UAC.


LonghornUser - Do 22.10.09 00:24

Das wäre auch ne Idee, aber mein Programm startet, wenn vom User gewünscht, im Autostart. Dann müsste man jedes mal bestätigen. Das wäre doch sehr nervig. Kann man dieses Verhalten irgendwie umgehen?


Delete - Do 22.10.09 01:05

Was passiert wenn du du vor dem Schreiben Suche im MSDN IMPERSONATELOGGEDONUSER aufrufst? Kommt dann die UAC?

http://www.michael-puff.de/Developer/Delphi/Code-Snippets/Impersonate.shtml


jaenicke - Do 22.10.09 06:20

user profile iconLonghornUser hat folgendes geschrieben Zum zitierten Posting springen:
Das isAdmin mache ich ja schon, aber es ist in diesem Fall nicht hilfreich, weil zB. ein Admin mit UAC trotzdem ein Admin bleibt, obwohl er keine uneingeschränkten Rechte hat.
Ich weiß nicht was dein IsAdmin macht, aber IsUserAnAdmin ist genau dafür um festzustellen, ob du über die UAC die Rechte hast... :roll:


LonghornUser - Do 22.10.09 13:57

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Was passiert wenn du du vor dem Schreiben Suche im MSDN IMPERSONATELOGGEDONUSER aufrufst? Kommt dann die UAC?

http://www.michael-puff.de/Developer/Delphi/Code-Snippets/Impersonate.shtml

Funktioniert das denn auch in XP?


Delete - Do 22.10.09 15:23

Warum sollte es nicht? Einmal in der Hilfe geguckt:
Zitat:
Requires Windows Vista, Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0 SP3 and later.


Außerdem hätte man es schnell mit meinem Beispielprogramm ausprobieren können, wenn XP vorhanden ist.