RegDeleteKey() funktioniert nicht
-
Hi,
ich möchte einen Registryeintrag im Schlüssel run löschen. Der Prozedur wird der Name des RegEintrages übergeben. Nur leistet sie das gewünschte leider nicht.RegDeleteValue() habe ich zum test eingebaut ( brauche ich aber normal nicht oder ? )
void DelAutorunKey(char *Aname){ HKEY hKey; if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, DELETE, &hKey) == ERROR_SUCCESS ){ RegDeleteValue(hKey, (LPCTSTR)Aname); RegDeleteKey(hKey, (LPCTSTR)Aname); } RegCloseKey(hKey); return; }Wo liegt mein Denkfehler ?
tia mfg ch
-
Also, wenn du den RUN-Schlüssel löschen willst, wird deine Anwendung garantiert blockiert, weil dieser Schlüssel ein System-Schlüssel ist. Ebenso könntest du versuchen, die kernel32.dll zu löschen. Wird dir nicht gelingen. Nur so als Idee. Ansonsten: Was denn, wenn du den Schlüssel nicht öffnen kannst? Ich würde das RegCloseKey noch in die Abfrage mit hinein nehmen. So, und wenn du den Schlüssel jetzt nicht öffnen kannst, passiert gar nichts. Probiers mal mit
/*...*/ } else { cout <<<"Fehler beim Schlüsselöffnen\nProgramm wird beendet." ExitProcess(29); }Unkompliziert und schnell. Und wir geben gleich noch einen Errorlevel, d. h. in dem Fall einen Process Exit Code zurück. Der im übrigen dem Win2k-Fehler-Code für "Kann nicht auf das angegebene Gerät schreiben" entspricht.
Tschö,
nullplan
-
Danke für die Antwort
Geöffnet wird der Schlüssel die else Bedingung hatte ich drin hab sie aber der Übersicht wegen rausgeworfen.Naja ich will nicht den ganzen Run Ordner löschen sondern nur einen Eintrag.
Mein Programm zeigt die autorun Einträge schon an
C:\>catz +autorun
Subkeys Gesamt: 1
OptionalComponents
Keys Gesamt: 6
NvCplDaemon RUNDLL32.EXE C:\WINDOWS\System32\NvCpl.dll,NvStartup
nwiz nwiz.exe /install
SiSUSBRG nwiz.exe /install
KernelFaultCheck nwiz.exe /install
AVGCtrl nwiz.exe /install
NvMediaCenter nwiz.exe /installnun möchte ich zB "AVGCtrl nwiz.exe /install" löschen das soll dann via
DelAutorunKey(*"AVGCtrl"); möglich sein. Nur das geht irgendwie nicht
mfg ch
-
c°h° schrieb:
Naja ich will nicht den ganzen Run Ordner löschen sondern nur einen Eintrag.
Dann brauchst du RegDeleteValue, nicht RegDeleteKey.
Wozu die Casts in deinem Code? Und sag jetzt bitte nicht, dass es sonst nicht kompilierbar ist.
-
Die casts hab ich erst reingemacht nachdem es aus mir unerklärlichen Gründen nicht funktionierte. Klar ist das auch ohne casts compilierbar.
Leider führte RegDeleteValue(hKey, Aname); ja auch nicht zum Ziel - hatte RegDeleteKey schonmal auskommentiert.
-
Wenn du gar keinen Plan mehr hast: Nimm die REG-Datei-Variante. Lass dein Programm eine kleine Datei mit folgendem Inhalt anlegen:
REGEDIT4 [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run] <Wertname>=-Die Leerzeile ist wichtig! Wenn du das hier getan hast, machst du einen Systemaufruf namens "regedit /s <filename.reg>". So habe ich die Registry immer bearbeitet, als ich noch nie was vom WinAPI gehört habe.
Tschö,
nullplan
-
MFK schrieb:
c°h° schrieb:
Naja ich will nicht den ganzen Run Ordner löschen sondern nur einen Eintrag.
Dann brauchst du RegDeleteValue, nicht RegDeleteKey.
Wozu die Casts in deinem Code? Und sag jetzt bitte nicht, dass es sonst nicht kompilierbar ist.
mach ich auch immer. ich bin zu faul die dateiendung die bei vc6 immer .cpp ist in .c zu ändern. als ob das jetzt so schlimm wäre. dieses besser-wisser gesülze geht einem irgendwann auf den senkel.

-
Casten ist prinzipiell schlimm... es gibt ausnahmen, wo man es muss, aber sonst macht es den COde nur unhandlich und unpflegbar...
-
Naja wie mans per regedit macht ist mir schon klar aber ich will ja ein systemsecurity und analyse Tool für meine paranoiden trojanerverfolgten Bekannten machen. Und hab keine Lust jedem zu erklären wie man die Registry manuell bearbeiten kann. Deshalb sollte mein Programm das schon können und da es ja gehen muss, werde ich auch solange weiterfummeln bis es geht
Bin bei solchen Dingen hartnäckig.Die cast Frage hat irgendwo schon ihre Berechtigung ich hab mich vor einigen Wochen mit derartigen Problemen rumgeschlagen.
Also so sieht mein aktueller Code aus leider immernoch nicht funktionstüchtig
void DelAutorunKey(char *Aname){ HKEY hKey; if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, DELETE, &hKey) == ERROR_SUCCESS ){ RegDeleteValue(hKey, Aname); //RegDeleteKey(hKey, (LPCTSTR)Aname); } else printf("RegOpenKeyEx()"); RegCloseKey(hKey); return; }Hat jmd noch eine Idee ?
-
Ach ich habs ein Recht fehlte folgender Code funktioniert

void DelAutorunKey(char *Aname){ HKEY hKey; if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, DELETE | KEY_SET_VALUE , &hKey) == ERROR_SUCCESS ){ RegDeleteValue(hKey, Aname); //RegDeleteKey(hKey, (LPCTSTR)Aname); } else printf("RegOpenKeyEx()"); RegCloseKey(hKey); return; }MFG c°h°
-
Und für's nächste Mal merken wir uns: Fehlersuchmethode Nummer 1: Rückgabewerte prüfen.
-
Es ist meistens Hilfreich, wenn Du genau sagst, was nicht geht; also z.B. den Fehlercode der zurückgeliefert wurde!
Nebenbei würde ich den Key nicht mit "DELETE" sondern mit "KEY_SET_VALUE" öffnen, dann würde es zumindest der Doku entsprechen...
-
Ich werds mir merken
Danke für eure Hilfe
