Registry Einträge in einer Datei abspeichern



  • @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! 👍



  • das von dir genannte Buch ist ok, das habe ich auch vollständig durchgemacht. Da du es gerade hier bei diesem Beispiel mit API-Funktionen zu tun hast, die nicht von der MFC "erfaßt" werden, siehst du schon, daß weitere Bücher empfehlenswert sind. Jeder Windows-Entwickler sollte das Standard-Werk "Windows-Programmierung" von Charles Petzold gelesen haben, später dann noch "Windows-Programmierung für Experten" von Jeffrey Richter (das letztgenannte bei wirklichem Interesse, noch mehr aus Windows "herauszuholen"). Aber du findest sicher noch im Forum weitere Buch-Tipps, auch zur Sprache C++ oder C selbst.

    MarKir schrieb:

    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?

    Löse dich erst mal davon, mit den "Bequemlichkeiten" der Oberfläche zu arbeiten, arbeite besser zu Anfang erst direkt im Code (bis auf den Einsatz des Klassen-Assistenten für Dialog/Klassen-Erstellung), damit du das wesentliche besser lernst, das Schreiben von Code direkt im Editor. In diesem Fall heißt das, platziere die Funktion, wie ich schon geschrieben habe, außerhalb jedes Blockes (du weißt, was ein Block ist?), von mir aus direkt vor die OnButtonImport-Funktion, per Copy & Paste (die andere Funktion SaveRegistrySubKey aus dem Artikel wird auf die gleiche Weise "global" gemacht). Wenn du alles richtig gemacht hast, dann sollte die Funktion anschließend unter "Global" zu sehen sein, aber selbst, wenn nicht, die Hauptsache ist, du kannst erst einmal fehlerfrei kompilieren.

    MarKir schrieb:

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

    das kannst du zwar in der Button-Funktion machen, so, wie ich es aber geschrieben habe, sollte das in die SaveReg-Funktion (sonst müßte man noch etwas ändern), eben anstelle der bisherigen Zeile mit hkey=..., und statt "Software\\Microsoft\\Windows NT\\CurrentVersion" und HKEY_LOCAL_MACHINE gibst du den dich interessierenden Schlüssel an

    MarKir schrieb:

    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.

    das ist immer noch ein Beispiel, das (vielleicht) noch lange nicht deinen Wünschen entspricht, versuche doch erst einmal, diesen Code lauffähig zu bekommen, dann kannst du an die Verbesserungen gehen.

    Das mit dem Dateinamen solltest du eigentlich sehen können (es steht auch im Artikel, wie das Beispiel arbeitet), also gehen wir das einmal von "hinten nach vorne" durch: wir wissen, daß RegSaveKey die Datei schreibt, also schauen wir uns die Argumente im Beispiel an:

    rc=RegSaveKey(hKeyToSave, szSaveFileName, NULL);
    

    also: szSaveFileName muß der Dateiname sein. Wo kommt szSaveFileName her? Es wird der Funktion SaveRegistrySubKey als Argument übergeben:

    LONG SaveRegistrySubKey(
        HKEY hKey,              // handle of key to save
        LPTSTR szSubKey,        // pointer to subkey name to save
        LPTSTR szSaveFileName   // pointer to save path/filename
        )
    

    und wo wird SaveRegistrySubKey aufgerufen? In meiner Beispiel-Funktion SaveReg:

    if( (lRetVal=SaveRegistrySubKey(hKey, szSubKey, szSubKey)
                ) != ERROR_SUCCESS)
    

    also: der Name der Datei ist immer der gerade verarbeitete Sub-Key szSubKey in der while-Schleife, den die Funktion RegEnumKeyEx ermittelt:

    while((rc=RegEnumKeyEx(
                            hKey,
                            dwSubKeyIndex,
                            szSubKey,
                            &dwSubKeyLength,
                            NULL,
                            NULL,
                            NULL,
                            NULL)
                            ) != ERROR_NO_MORE_ITEMS) { // are we done?
    

    jetzt sollte klar sein, was hier passiert...

    MarKir schrieb:

    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 🙂

    ich gebe gern mein Wissen weiter, sonst würde ich hier nicht im Forum Fragen beantworten, da ist es egal, ob Anfänger(-Frage) oder nicht. Und du solltest dich nicht so "runtermachen", ich denke das von dir Geschriebene sicher nicht. Was ich aber denke, habe ich schon geschrieben, du mußt dein C/C++-Grundwissen festigen, mußt mehr probieren als du Fragen stellst, und eben ein bischen mehr dich mit der Sache beschäftigen (und dies ist schon ein "fortgeschrittenes Thema", mit Privileges, Token, Registry-Handling, sonst wäre der Artikel auch nicht in der Microsoft-KB), denn die Probleme, die du mit diesem Code hast, sind weniger Windows-/MFC-Probleme (bis auf die Besonderheit mit den Privileges, die man als Admin auch noch braucht), sondern grundsätzliche (Verständnis-)Probleme, einen Beispiel-(C-)Code einzubauen, der nicht MFC-spezifisch ist, sondern mehr mit Windows-API-Programmierung zu tun hat. Fasse es also als "positive Kritik" auf, und nicht als Geringschätzung deiner Person, die sich sicher Mühe gibt, das hier zu verstehen und anzuwenden. Aber das kommt mit der Zeit, nur liegt es an dir, wie schnell und effizient du vorankommst, durch Eigeninitiative.

    MfG



  • Hallo,

    folgenden Code habe ich nun Global hinterlegt:

    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(".", 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; 
    
    }
    

    Einen Fehler habe ich schon behoben, und zwar konnte er nichts mit Machine Name anfangen und statt dessen kann man auch

    "."
    

    sagen. Den zweiten Fehler kann ich leider nicht zu ordnen, habe auch deswegen in der MSDN nachgeschaut und dort steht nur geschrieben das die windows.h included sein muss, aber dies ist der Fall. Die FEhlermeldung lautet: "D:\VC++ Projekte\1\MFCDlgTest\MFCDlgTestDlg.cpp(239) : error C2065: 'SaveRegistrySubKey' : nichtdeklarierter Bezeichner
    Fehler beim Ausführen von cl.exe."

    Danke für Deine Unterstützung und einen schönen Tag!



  • so langsam kommen wir voran...

    MarKir schrieb:

    Einen Fehler habe ich schon behoben, und zwar konnte er nichts mit Machine Name anfangen und statt dessen kann man auch C/C++ Code:

    "."

    sagen

    sehr gut 👍 Das war ein Copy & Paste-Fehler meinerseits, MachineName macht nur in der "Original-Version" Sinn. Schreibe aber besser NULL statt "." in den Funktionsaufruf:

    [cpp]
    if(!LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &luid))
    [/cpp]

    NULL steht für den lokalen Rechner, "." ist nicht vorgesehen, wenn man die lokalen Privileges haben möchte.

    MarKir schrieb:

    Den zweiten Fehler kann ich leider nicht zu ordnen, habe auch deswegen in der MSDN nachgeschaut und dort steht nur geschrieben das die windows.h included sein muss, aber dies ist der Fall. Die FEhlermeldung lautet: "D:\VC++ Projekte\1\MFCDlgTest\MFCDlgTestDlg.cpp(239) : error C2065: 'SaveRegistrySubKey' : nichtdeklarierter Bezeichner
    Fehler beim Ausführen von cl.exe."

    Hast du die Funktion SaveRegistrySubKey eingebaut (auch global, wie die andere?)? Platziere sie zunächst vor die Funktion SaveReg (normalerweise macht man die Funktionen durch eine Deklaration bekannt, aber mache es erst mal so), ich kopiere sie hier noch einmal in das Forum hinein:

    LONG SaveRegistrySubKey(
        HKEY hKey,              // handle of key to save
        LPTSTR szSubKey,        // pointer to subkey name to save
        LPTSTR szSaveFileName   // pointer to save path/filename
        )
    {
        HKEY hKeyToSave;    // Handle of subkey to save
        LONG rc;            // result code from RegXxx
        DWORD dwDisposition;
    
        if((rc=RegCreateKeyEx(hKey,
                              szSubKey, // Name of subkey to open
                              0,
                              NULL,
                              REG_OPTION_BACKUP_RESTORE, // in winnt.h
                              KEY_QUERY_VALUE, // minimal access
                              NULL,
                              &hKeyToSave,
                              &dwDisposition)
                              ) == ERROR_SUCCESS)
        {
            // Save registry subkey.  If the registry is remote, files will
            // be saved on the remote machine
            rc=RegSaveKey(hKeyToSave, szSaveFileName, NULL);
    
            // close registry key we just tried to save
            RegCloseKey(hKeyToSave);
        }
    
        // return the last registry result code
        return rc;
    }
    

    das also vor SaveReg kopieren, dann ist SaveRegistrySubKey auch für SaveReg bekannt.

    MfG



  • Hallo und einen schönen Tag,

    ich habe es nun endlich so weit geschafft, das das Programm ohne Fehler kompiliert werden kann, ich denke da sind wir dann endlich mal einen Schritt weitergekommen.

    Da ja jetzt beim Klick auf den Button "Export" noch nichts passiert, sollte man jetzt, meiner Meinung nach, daran gehen, dass wir einen Aufruf der von Dir programmierten Funktion "Savereg" ausführt, um die gewünschten Regkeys zu exportieren.

    Da stehe ich aber nun leider auf dem sogenannten Schlauch und bräuchte einen Gedankenanstoss deinerseits.

    Ich wünsche Dir einen schönen Abend und ein ebenso schönes Wochenende!

    Und danke für Deine tatkräftige Unterstützung!



  • MarKir schrieb:

    Da stehe ich aber nun leider auf dem sogenannten Schlauch und bräuchte einen Gedankenanstoss deinerseits.

    nun, so sehr muß ich hoffentlich deine Gedanken nicht anstossen, wie erreicht man, daß eine Funktion das auch ausführt, was in ihr programmiert wurde?? Man ruft sie einfach da auf, wo man sie benötigt, also ein Aufruf von SaveReg in der Button-Funktion, und schon passiert auch etwas (entweder Fehlermeldungen oder ein paar Dateien werden erzeugt). Die Definitionen von SaveReg und SaveRegistrySubKey sollten natürlich vor der Button-Funktion stehen, damit der Compiler sie kennt.

    MfG



  • Hallo,

    habe das ohne eine einzige Fehlermeldung kompilieren können un d erhalte dann im Verzeichnis des Projektes folgende Dateien:
    1.) Hardware
    2.) SAM
    3.) Security
    4.) Software
    5.) System

    Dies sind dann also die exportierten Registry Keys, wie es mit dem Programm nun geht. Jetzt muss ich das ganze ja dann "nur" noch auf meine Registrykeys anpassen oder?

    Mal angenommen ich will mehrere Registry Keys durch Auswahl mit einer Checkbox exportieren, muss ich dann dementsprechend oft den Code von Dir einsetzen oder gibt es da eine weitaus einfachere Lösung?

    Schöne Wochenende und vielen Dank!



  • ok, dann ist das Hauptproblem gelöst

    MarKir schrieb:

    Dies sind dann also die exportierten Registry Keys, wie es mit dem Programm nun geht. Jetzt muss ich das ganze ja dann "nur" noch auf meine Registrykeys anpassen oder?

    ganz genau, einfach nur dafür sorgen, daß der richtige Schlüssel für hkey angegeben wird.

    MarKir schrieb:

    Mal angenommen ich will mehrere Registry Keys durch Auswahl mit einer Checkbox exportieren, muss ich dann dementsprechend oft den Code von Dir einsetzen oder gibt es da eine weitaus einfachere Lösung?

    du mußt für jeden zu exportierenden Schlüssel SaveReg aufrufen, das ist eigentlich alles.

    MfG



  • Hallo,

    das heißt also in dem folgenden Codeauszug, muss ich dann statt "hKey=HKEY_LOCAL_MACHINE"; folgendes hinterlegen
    "HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion"?

    ...
    if (GetLastError() != ERROR_SUCCESS) 
        { 
            AfxMessageBox("AdjustTokenPrivileges"); 
            return GetLastError(); 
        } 
      hKey=HKEY_LOCAL_MACHINE; 
    
        while((rc=RegEnumKeyEx( 
                            hKey, 
                            dwSubKeyIndex, 
                            szSubKey, 
                            &dwSubKeyLength, 
    ...
    

Anmelden zum Antworten