RegDeleteTree
-
Hallo, ich hatte bereits unter MFC geschrieben, glaube aber es gehört
eigentlich nach WinAPI!Ich versuche einen Key inkl UNterkeys in der Registry zu löschen.
Das Programm gibt mir aber jedesmal aus, dass ERROR_SUCCESS nicht
erfolgreich war.Das Programm soll möglichst auf 64 und 32bit Systemen lauffähig sein.
Ich finde den vermalledeiten Fehler nicht
Den Eintrag in der Registry gibt es definitiv:HKEY hkey=0; RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Software\\Microsoft"),0,KEY_ALL_ACCESS,&hkey); LONG retw; retw = RegDeleteTree(hkey,"MSLicensing"); if(retw==ERROR_SUCCESS) { MessageBox("MSLicensing-Key wurde entfernt!","MSLicensingeintrag gelöscht...",MB_ICONINFORMATION); OnOK(); } else { MessageBox("Es gab einen Fehler beim Löschen des MSLicensingkey!\n\nKey evtl. bereits gelöscht?","Fehler:",MB_ICONINFORMATION); OnOK(); }
-
Evtl. mangelnde Rechte?
http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884.aspx
-
Die Rechte habe ich offenbar. Über regedit kann ich sauber löschen.
Mir wird mit GetLastError "Vorgang erfolgreich beendet" gemeldet....??
-
Es geht nicht drum ob dein Account die Rechte hat, sondern dein Programm. regedit verlangt nach Adminrechten und ist auf x64 ein 64bit Prozess...
-
Dann verstehe ich noch nicht, wie ich da ran gehe?
Ich habe zwischenzeitlich ein manifest eingebunden:<?xml version="1.0" encoding="utf-8"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" /> </requestedPrivileges> </security> </trustInfo> </assembly>
-
Ich glaube ich habs:
Einfachbei RegOPenKeyEx noch KEY_ALL_ACCESS|KEY_WOW64_64KEY mit angeben.
Frage: wie verhält sich das Programm dann aber auf 32bit Systemen?
Oder wird dann KEY_WOW64_64KEY ignoriert?Ansonsten müsste ich doch zuvor das System ermitteln 32 o. 64 bit und
entsprechend anderen Code für RegOPenKeyEx ausführen oder (z.B. KEY_WOW64_32KEY)?
-
HKEY_LOCAL_MACHINE benötigt admin Rechte! asInvoker langt nicht auf Vista und Windows7
-
Hallo Martin,
ich benötige requireAdministrator nicht. Es lag tatsache daran, dass es
ein 64bit System ist und ich nicht KEY_WOW64_64KEY verwendet habe.
zur Sicherheit habe ich aber deinen Rat befolgt und requireAdministrator
im Manifest mit angegeben. Danke für den HinweisSo sieht der wesentliche Quellcode nun aus:
HKEY hkey=0; RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\MICROSOFT"),0,KEY_ALL_ACCESS|KEY_WOW64_64KEY,&hkey); LONG retw; retw = RegDeleteTree(hkey,"Licensing");
Nun meinte jemand zu mir, dass ich aufpassen soll, dass nicht Software\Microsoft
komplett gelöscht wird, wenn der 2te Parameter in RegDeleteTree nicht gefunden wird.... Die Doku sagt dazu ja auch:The name of the key. This key must be a subkey of the key identified by the hKey parameter. If this parameter is NULL, the subkeys and values of hKey are deleted.
Hast du eine Idee, wie ich das am sichersten gestalte? Bzw. verstehe ich es
richtig? Wenn ich einen festen String (wie oben) einprogrammiere, dann ist
dieser ja nicht NULL. Folglich kann er maximal nicht gefunden werden. Was aber
nicht als Auswirkung hat, dass Software\Microsoft gelöscht wird?!Würde ich den subKey im Quellcode ermitteln und dabei auf NULL laufen, dann
hätte ich ein Problem, wenn ich NULL nicht abfange...oder?
Somit ist obige Variante ungeachtet ob es den Key gibt oder nicht sicher.
-
Du benötigst zu 100% den Schlüssel rquireAdministrator!
HKLM ist für nicht angehobene Prozesse immer schreibgeschützt.Ansonsten ist das Quatsch. Wenn der Subkey nicht da ist, dann wird auch nichts gelöscht.
Woraus schließt Du bei diesem Text, dass dies geschehen könnte.
-
Ich komme darauf weil:
If this parameter is NULL, the subkeys and values of hKey are deleted
das doch bedeutet, dass wenn der 2te Parameter NULL ist alle subkeys von
hKey (beispielsweise Local_Machine\Software\Microsoft) gelöscht werden, oder verstehe ich das nicht richtig?
-
Eben! Aber, da Du den zweiten Wert ja angibst hast Du doch kein Problem...