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();
    }
    




  • 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)?


  • Mod

    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 Hinweis 👍

    So 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.


  • Mod

    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?


  • Mod

    Eben! Aber, da Du den zweiten Wert ja angibst hast Du doch kein Problem...


Anmelden zum Antworten