Registry: Problem beim lesen der ProductId



  • Guten Morgen!

    Für mein Vorhaben benötige ich die Windows ProductId aus der Registry. (REG_SZ == String)
    Ich habe mich schonmal etwas schlau gemacht, doch ich komme zu keinem Ergebnis mit meinem Code:

    int main()
    {
        HKEY hKey = 0;
        char buf[255] = {0};
        DWORD dwType = 0;
        DWORD dwBufSize = sizeof(buf);
        const char* subkey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
    
        if( RegOpenKey(HKEY_LOCAL_MACHINE,subkey,&hKey) == ERROR_SUCCESS)
        {
            dwType = REG_SZ;
            if( RegQueryValueEx(hKey,"ProductId",0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS)
            {
                cout << "Windows Produkt-ID: '" << buf << "'\n";
            }
            else
            {
                cout << "Die Suche nach der Produkt-ID ist nicht moeglich.\n";
            }
        }
    
        else
        {
            //EIN ANDERER FEHLER IST AUFGETRETEN
        }
    
        RegCloseKey(hKey);
        return 0;
    
    }
    

    Compiler bringt keinen Error, Programm startet normal, doch ich erhalte meinen Fehler: "Die Suche nach der Produkt-ID ist nicht moeglich."

    Was hab ich da falsch gemacht?

    MfG
    myZeL



  • jz hab ich extra in der msdn gesucht, weil ich mich über "error_success" lustig machen wollte... ^^

    dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                                 TEXT("Global"),
                                 NULL,
                                 NULL,
                                 (LPBYTE) PerfData,
                                 &cbData );
        while( dwRet == ERROR_MORE_DATA )
        {
            // Get a buffer that is big enough.
    
            BufferSize += BYTEINCREMENT;
            PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
            cbData = BufferSize;
    
            printf(".");
            dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                             TEXT("Global"),
                             NULL,
                             NULL,
                             (LPBYTE) PerfData,
                             &cbData );
        }
        if( dwRet == ERROR_SUCCESS )
            printf("\n\nFinal buffer size is %d\n", BufferSize);
        else printf("\nRegQueryValueEx failed (%d)\n", dwRet);
    

    mal auf ERROR_MORE_DATA geprüft?

    bb

    PS: Falsches Unterforum - richtig wäre WinAPI gewesen. Aber dich wird scho nen Mod dahin verschieben...



  • Ich sehe keinen Fehler.
    Jedoch solltest du den Returnwert nicht nur gegen 0 testen, sondern ihn speichern und im Fehlerfall ausgeben. Ist er vielleicht 2? Dann ist der Eintrag nicht vorhanden (http://msdn.microsoft.com/en-us/library/ms681382%28v=VS.85%29.aspx).
    ERROR_MORE_DATA sollte eigentlich nicht zurückgegeben werden. Blödsinn gelöscht, Unskilled hat Recht.

    Edit: Mal mit regedit geschaut, ob der Schlüssel vorhanden ist?



  • Vicious Falcon schrieb:

    Ich kann mir auf jeden Fall nicht vorstellen, dass irgendjemand 254 Zeichen abtippen möchte. :p

    ich glaube nicht, dass man den windows-key dort 1:1 abspeichert - hab mal geguckt - das ist auch nicht der key, den man eingibt - allerdings ist er trotzdem deutlich kürzer... ^^

    ich habs einfach mal so hier getestet:

    #include <Windows.h>
    
    #include <iostream>
    using namespace std;
    
    int main()
    {
        HKEY hKey = 0;
        char buf[255] = {0};
        DWORD dwType = 0;
        DWORD dwBufSize = sizeof(buf);
        const char* subkey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
    
        if( RegOpenKey(HKEY_LOCAL_MACHINE,subkey,&hKey) == ERROR_SUCCESS)
        {
            dwType = REG_SZ;
    		DWORD ret = RegQueryValueEx(hKey,"ProductId",0, &dwType, (BYTE*)buf, &dwBufSize);
    		if (ret == ERROR_SUCCESS)
    			cout << "geht doch" << endl;
    		else
    			cout << "fehler: " << ret << endl;
        }
        else
        {
            //EIN ANDERER FEHLER IST AUFGETRETEN
        }
    
        RegCloseKey(hKey);
        return 0;
    
    }
    

    hier funktioniert es (allerdings hab ich hier auch admin-rechte - vll fehlen die dir?).
    du kannst ja mal sagen, was bei dir ausgegeben wird...

    bb



  • Du solltest den Rückgabewert bzw. GetLastError() auswerten, das liefert dir den Grund des Fehlschlags.



  • SetLastError wird in RegQueryValueEx nicht aufgerufen. Im Fehlerfall kann man nur den Returnwert überprüfen (gerade ausprobiert).
    Admin-Rechte sollte man nicht benötigen, um _lesend_ auf die Registrierung zuzugreifen.



  • Ok. Danke für die vielen Ratschläge!

    Ich habe gerade geschaut: Fehler 2 ...
    Pfad usw. stimmt alles. Admin bin ich auch hier unter 7.

    Ich möchte nicht den ProduktKey - nur die ProduktID, wie sie auch im Klartext in der Registry zu sehen ist.

    @Moderatoren: Bitte ins WinAPI Forum verschieben! Danke.

    Gibt es denn noch eine andere Möglichkeit den Wert auszulesen?

    EDIT: Mysteriös... wenn ich was anderes als die ProductId auslese (auch reg_sz) dann klappt das 😕



  • Ich habe gerade geschaut: Fehler 2 ...
    Pfad usw. stimmt alles. Admin bin ich auch hier unter 7.

    aber du hast per hand gesucht, ob der schlüssel vorhanden ist?



  • Ja natürlich.

    Es klappt nur bei diesem Eintrag nicht.

    Wenn ich was anderes wie System auslese, dann klappt das einwandfrei.

    Ich brauche aber nun mal nur die ProductId.



  • hmm.. und du hast auch wirklich keine buchstabendreher oder so in ProductID drin?
    Oder vll ausversehen ProduktID geschrieben?

    ansonsten musst du wohl mal im WinAPI-forum explizit nach diesem Problem fragen...
    ich kanns jedenfalls nicht reproduzieren.

    bb



  • Vielleicht hast du dir ja auch deine Registry zerschossen und Windows hat kaputte Zugriffsrechte für diesen Schlüssel. Lass dein Programm doch mal auf einem anderen Rechner laufen und guck was dabei rauskommt.


Anmelden zum Antworten