Registry Einträge in einer Datei abspeichern



  • nicht wirklich 😉

    füg mal zwei Traces ein:

    DWORD err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion",0, KEY_READ, &hkey); 
    TRACE("RegOpenKeyEx: err=%Xh\n", err);
    err = RegSaveKey(hkey, "c:\\registrytest.reg", NULL); 
    TRACE("RegSaveKey: err=%Xh\n", err);
    RegCloseKey(hkey);
    


  • Das habe ich dann im Debug Modus herausgefunden:

    Warning: no listbox item selected.
    RegOpenKeyEx: err=0h
    RegSaveKey: err=522h
    Thread 0xA8C wurde mit Code 0 (0x0) beendet.
    Das Programm "C:\Dokumente und Einstellungen\Marc\Desktop\MFCDlgTest\Debug\MFCDlgTest.exe" wurde mit  Code 0 (0x0) beendet.
    


  • Fehlt höchstwahrscheinlich das BVackup Privilege für de angemeldeten User (522h - Der Client besitzt ein erforderliches Recht nicht.)

    Sollte aber als Admin gehen...



  • Das ist aber merkwürdig, da ich an meinem PC mit lokalen Administratorrechten angemeldet bin. ALles sehr merkwürdig, wie ich finde...



  • Hallo C++ Gemeinde,

    kann mir vielleicht jemand bei meinem Problem weiterhelfen, da ich hier an diesem Punkt einfach nicht weiterkomme. Vielen Dank für Eure Super Unterstützung.



  • Hallo zusammen,

    kann mir denn wirklich keiner bei meinem Problem weiterhelfen???

    Das Problem besteht darin, das er zwar nun mit dem neuen C++ Code die Datei anlegt, aber leider auch ohne Inhalt. Administratorrechte sind vorhanden.

    Danke für Eure Hilfe



  • Hallo,

    da ich nun in einigen Beiträgen gelesen habe, das man auch als Administrator unter Windows NT, 2000 und XP noch spezielle Rechte benötigt, wollte ich Euch fragen, da ich den Code aus den anderen Beiträgen nicht vertshe, ob sich jemand bereit erklären würde und mir das in den vorhandenen Code integrieren könnte. Danke schon mal vorab für Eure Hilfe!

    void CMFCDlgTestDlg::OnButtonImport()
    
    {
    HKEY hkey; 
    
    DWORD err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion",0, KEY_ALL_ACCESS, &hkey);
    err = RegSaveKey(hkey, "c:\\registrytest.reg", NULL); 
    
    RegCloseKey(hkey); 
    }
    


  • versuch mal die msdn zu lesen - was ich so rauslese ist, das du anscheinend nicht mal weisst was,und wozu die gut ist !

    du weisst nicht mal was fehlercodes sind.....schwach



  • @fdk

    Ich finde es erbärmlich, wie Du Dich hier gegenüber einem Neueinsteiger von C++ verhälst. Das ist einfach unterstes Niveau und habe ich in dieser Form noch in keinem Forum erleben dürfen. Ich nehme auch mal an, das Du normalerweise einen registrierten Benutzernamen hast und Dich nicht traust Dich zu outen...

    Mein Problem ist nicht, das ich nicht lesen kann, sondern das ich den in anderen Beiträgen gefundenen Code zum Thema Backup Privilege nicht verstehe und daher hier um Hilfe gebeten habe, damit ich das verstehe.

    Vielleicht wäre nun jemand so nett und könnte mir bei meiner Problemlösung weiterhelfen und nicht so geistreich antworten wie fdk.

    Ich wünsche allen anderen einen schönen Abend und vielen Dank für die sonstige Unterstützung, die ich hier schon erleben durfte.



  • Hallo zusammen,

    ist hier vielleicht jemand in der Lage, mir bei meinem Problem weiter zu helfen?
    Ich habe immer noch das Problem, das mir ein bestimmtes Backup Privilege fehlt, obwohl ich Administratorrechte besitze.

    Danke für Eure Hilfe...

    Hier nochmal mein bsiheriger Code:

    void CMFCDlgTestDlg::OnButtonImport()
    
    {
    HKEY hkey; 
    
    DWORD err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion",0, KEY_ALL_ACCESS, &hkey);
    err = RegSaveKey(hkey, "c:\\registrytest.reg", NULL); 
    
    RegCloseKey(hkey); 
    }
    


  • SE_BACKUP_NAME ?



  • Hallo,

    das Setzen der entsprechenden Rechte wird exemplarisch in einem KB-Artikel gezeigt:

    http://support.microsoft.com/?kbid=128731

    MfG



  • Vielen Dank @Probe-Nutzer:

    Habe den Code nun mal so in ein neues MFC Projekt eingefügt und erhalte dann eine Fehlermeldung mit dem Hinweis: error C2447: Funktionskopf fehlt - Parameterliste im alten Stil?

    Kannst Du mir da eine Antwort drauf geben?

    Danke!



  • der Code ist, so wie er dort im Artikel steht, korrekt. Wahrscheinlich hast du ihn ungünstig platziert, oder einen kleinen Schreibfehler gemacht. So ohne weitere Angaben kann man zu dem Fehler jedoch nichts genaueres sagen, da ich auch nicht weiß, welchen Teil des Codes du in das MFC-Projekt übernommen hast (der dort gezeigte Code ist ja für eine Konsolenanwendung, so daß nur die wichtigsten Teile in das MFC-Projekt übernommen werden sollten)

    MfG



  • Hallo,

    der Fehler ist raus, war ein Schreibfehler... Danke

    Aber es besteht imemr noch das Problem, das in die Datei keine Daten geschrieben werden und den Artikel den Du gelinkt hast sowie das Stichwort "SE_BACKUP_NAME" kann ich leider nicht umsetzen und hoffe das Du mir hierbei behilflich sein könntest.

    Danke!



  • Hallo.

    Hat vielleicht noch jemand eine Antwort für mich? Das wäre sehr nett, danke!



  • du solltest schon dem Forum etwas entgegen kommen, und dein Problem bzw. deine Versuche mit den aus dem Artikeln zu entnehmenden Code-Teilen genauer angeben. Das ist jedenfalls eine bessere (Diskussions-)Grundlage, als nur zu schreiben, daß du etwas nicht umsetzen kannst. Nimm mir diese Worte nicht übel (weil ich deine Kenntnisse nicht einschätzen kann), aber etwas Eigeninitiative zeigen kann auch andere hier ermuntern, deinen (bisherigen) Code zu verbessern, als erst alles von vornherein nachlesen zu müssen. Also folgende Teile sollten in deinem Code sein:

    die Definition der Funktion SaveRegistrySubKey kannst du direkt in den Code einfügen, dann kannst du z.B. eine Funktion mit dem Namen SaveReg basteln:

    DWORD SaveReg()
    {
       TOKEN_PRIVILEGES tp;
       HANDLE hToken;
       LUID luid;
       LONG rc;     // contains error value returned by Regxxx()
       HKEY hKey;   // handle to key we are interested in
       // machine name wird nicht benoetigt, wenn lokaler Rechner
       // LPTSTR MachineName=NULL; // pointer to machine name
       DWORD dwSubKeyIndex=0;   // index into key
       char szSubKey[_MAX_FNAME]; // this should be dynamic.
                                // _MAX_FNAME is good because this
                                // is what we happen to save the
                                // subkey as
       DWORD dwSubKeyLength=_MAX_FNAME; // length of SubKey buffer
    
        if(!OpenProcessToken(GetCurrentProcess(),
                            TOKEN_ADJUST_PRIVILEGES,
                            &hToken ))
        {
            AfxMessageBox("OpenProcessToken");
            return GetLastError();
        }
    
        if(!LookupPrivilegeValue(MachineName, SE_BACKUP_NAME, &luid))
    
        {
            AfxMessageBox("LookupPrivilegeValue");
            return GetLastError();
        }
    
        tp.PrivilegeCount           = 1;
        tp.Privileges[0].Luid       = luid;
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
        AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
                                    NULL, NULL );
    
        if (GetLastError() != ERROR_SUCCESS)
        {
            AfxMessageBox("AdjustTokenPrivileges");
            return GetLastError();
        }
    
        hKey=HKEY_LOCAL_MACHINE;
    
        while((rc=RegEnumKeyEx(
                            hKey,
                            dwSubKeyIndex,
                            szSubKey,
                            &dwSubKeyLength,
                            NULL,
                            NULL,
                            NULL,
                            NULL)
                            ) != ERROR_NO_MORE_ITEMS) { // are we done?
    
        if(rc == ERROR_SUCCESS)
       {
            LONG lRetVal; // return value from SaveRegistrySubKey
    
            // save registry subkey szSubKey to filename szSubKey
            if( (lRetVal=SaveRegistrySubKey(hKey, szSubKey, szSubKey)
                ) != ERROR_SUCCESS)
            {
                AfxMessageBox("SaveRegistrySubKey");
                return (DWORD) lRetVal;
            }
    
            // increment index into the key
           dwSubKeyIndex++;
    
           // reset buffer size
            dwSubKeyLength=_MAX_FNAME;
    
            // Continue the festivities
            continue;
        }
        else
       {
           // 
           // note: we need to watch for ERROR_MORE_DATA
           // this indicates we need a bigger szSubKey buffer
           // 
            AfxMessageBox("RegEnumKeyEx");
            return (DWORD) rc;
       }
    
        } // RegEnumKeyEx
    
        // close registry key we have been working with
        RegCloseKey(hKey);
    
        // Revoke all privileges this process holds (including backup)
        AdjustTokenPrivileges( hToken, TRUE, NULL, 0, NULL, NULL);
    
        // close handle to process token
        CloseHandle(hToken);
    
        return 0;
    }
    

    wie du siehst, habe ich nur geringfügige Anpassungen gemacht, damit es "MFC-gerecht" ist, und einen ähnlichen Versuch hatte ich von dir erwartet, damit man darauf aufbauen kann...

    auch das ist natürlich nur ein Grundgerüst, und ungetestet, und möglicherweise nicht fehlerfrei (du mußt z.B. den Registry-Schlüssel anpassen), hier wird einfach nur HKEY_LOCAL_MACHINE verarbeitet, aber das Prinzip für andere Schlüssel sollte klar sein.

    MfG



  • Hallo Probenutzer,

    ich habe mir Deine Kritik zu herzen genommen und sehe ein, dass es besser gewesen wäre, wenn ich das hier anders angegangen wäre und hoffe, das ich dies jetzt hiermit auch tue. Danke auch erstmal für Deinen Code, zu dem ich ganz blöde Fragen habe:

    1.) Wenn ich nun einen speziellen key exportieren möchte, dann muss ich doch einfach folgende Zeile:

    hKey=HKEY_LOCAL_MACHINE;
    

    in dies hier abändern, oder?

    hkey=HKEY_LOCAL_MACHINE\\...;
    

    2.) Wenn ich das Programm ausführen möchte, dann bekomme ich eine Fehlermeldung mit dem Hinweis, "D:\VC++ Projekte\1\MFCDlgTest\MFCDlgTestDlg.cpp(183) : error C2601: 'SaveReg' : Lokale Funktionsdefinitionen sind unzulaessig
    ". Das heißt für mich, das ich nun dass ich den Codeteil woanders in meinem Projekt einfügen muss und nicht nach

    void CMFCDlgTestDlg::OnButtonImport()
    

    Meine Frage ist jetzt natürlich, zum Verständnis, wo muss ich den Teil hinprogrammieren, damit dieser Fehler nicht mehr ist, vielleicht auch mit einer einfachen Erklärung.

    die Definition der Funktion SaveRegistrySubKey kannst du direkt in den Code einfügen, dann kannst du z.B. eine Funktion mit dem Namen SaveReg basteln:

    Das heißt für mich ich kann mir aus dem Savereg und einer Erweiterung z.B. um einen Dateinamen den Dateinamen definieren?

    Danke nochmal für Deine Hilfe! Ich werde mich bemühen, dass ich meine Fragen präziser stelle und mir mehr Mühe bezüglich des Coden und der Mithilfe geben werde! 🙂



  • ich habe jetzt gerade in einer zurückliegenden Frage von dir gelesen, daß du erst am Anfang in der Windows-Programmierung stehst. Wenn du dich weiter damit beschäftigen willst, solltest du Tutorials oder Bücher dazu lesen, denn es fehlt an einigen Stellen am Verständnis, leider nicht nur an windows-spezifischen Dingen, sondern auch beim Programmieren in C/C++ fehlen dir wichtige Kenntnisse, wie deine zweite Frage zeigt:

    MarKir schrieb:

    2.) Wenn ich das Programm ausführen möchte, dann bekomme ich eine Fehlermeldung mit dem Hinweis, "D:\VC++ Projekte\1\MFCDlgTest\MFCDlgTestDlg.cpp(183) : error C2601: 'SaveReg' : Lokale Funktionsdefinitionen sind unzulaessig

    globale Funktionen stehen außerhalb jedes Blockes, du kannst also nicht einfach eine Funktions-Definition in eine andere schreiben, die von mir angegebene Funktion SaveReg steht also ganz eigenständig in der .cpp-Datei. Das hast du ja der Fehlermeldung schon entnommen, in void CMFCDlgTestDlg::OnButtonImport() hat also die Funktion nichts verloren, du kannst sie dort dann aufrufen, aber das ist etwas anderes.

    MarKir schrieb:

    Wenn ich nun einen speziellen key exportieren möchte, dann muss ich doch einfach folgende Zeile:

    hKey=HKEY_LOCAL_MACHINE;

    in dies hier abändern, oder?

    hkey=HKEY_LOCAL_MACHINE\...;

    nein, betrachte doch erst einmal den Datentyp. hkey ist ein HKEY, also ein Registry-Key-Handle, und kein Pfad oder eine Zeichenkette. Wie man einen anderen Key öffnet und dafür dann ein HKEY bekommt, hast du eigentlich schon gesehen oder gemacht:

    DWORD err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion",0, KEY_ALL_ACCESS, &hkey);
    

    erst damit bekommt man ein Handle (in hkey) auf einen Sub-Key der den vordefinierten Registry-Key-Handles entsprechenden Schlüssel (und dort gibst du einfach den dich interessierenden Pfad zum Sub-Key an). Dieser dadurch erhaltene hkey tritt anstelle des in dieser Zeile:

    hKey=HKEY_LOCAL_MACHINE;
    

    verwendeten hkey.

    MarKir schrieb:

    Das heißt für mich ich kann mir aus dem Savereg und einer Erweiterung z.B. um einen Dateinamen den Dateinamen definieren?

    SaveReg ruft nur SaveRegistrySubKey auf, und diese Funktion erzeugt für jeden Sub-Key eine eigene Datei. Du kannst das natürlich anpassen...

    MfG



  • Hallo,

    ein Buch habe ich mir mittlerweile angeschafft und zwar ´"Inside Visual C++ 6.0" ist mir empfohlen worden. Vielleicht hast Du aber auch noch Büchertipps für mich, die Du Empfehlenswert findest.

    Ich habe jetzt verstanden, dass das Global hinterlegt werden muss. Jetzt habe ich in meinem Projekt in den Klassen den Eintrag "Global" gesehen, muss der Code dann da hinein kopiert werden? Und wenn der ganze oder nur ein Teil davon?

    Dann muss ich also beim Öffnen des Registrykeys folgendes in die Button Funktion Programmieren:

    DWORD err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion",0, KEY_ALL_ACCESS, &hkey);
    

    Wie muss ich das dann mit dem Savereg handeln, das habe ich leider noch nicht so ganz verstanden, da ich noch nicht gesehen habe, wo Du einen Dateinamen angibst.

    Super Dank aber nochmal an Dich für Deine Bemühungen, mir zu helfen. Du denkst sicherlich, was ist das für ein Depp, der sollte lieber was anderes machen. Aber ich denke mir, jeder fängt mal klein an 🙂

    Also Danke! 👍


Anmelden zum Antworten