Regestry



  • da steht auch:
    Unter Windows NT ist es "normalen" Anwendern ohne Administrator-Rechte nicht erlaubt, auf den HKEY_LOCAL_MACHINE-Schlüssel der Registry schreibend zuzugreifen

    aber wenn ich kein admin bin hab ich ja die rechte nicht was in die registry zu schreiben oder? wenn regedit auch nicht zugelassen wird!??

    cu





  • wenn ich wüsste was da genau gemacht wird*g*
    dann wäre ich zufrieden...hmm...
    scheißt grösser zu sein das problem als gedacht.....;-(



  • Lies dir das doch mal genau durch. Dann wirste's auch schaffen!



  • hab 2 varianten:

    // In die Registry schreiben: mit TRegistry
    
       TRegistry* reg = new TRegistry;
       reg->RootKey = HKEY_LOCAL_MACHINE;
       reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);
       reg->WriteString("Programm", "C:\\Temp\\Programm.exe");
       reg->CloseKey();
       delete reg;  
    
    // In die Registry schreiben: mit Winapi
       HKEY hkey;
       HKEY KEY = HKEY_LOCAL_MACHINE;
       char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"};
       char name[100]= {"Programm"};
       char value[100]= {"C:\\Temp\\Programm.exe"};
    
       RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey);
       RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value));
       RegCloseKey(hkey);
    

    so wie kann ich rausfinden das es den schlüssel schon gibt....will nicht immer überschreiben!!!

    cu



  • ich meine, du müsstest ihn dazu versuchen auszulesen: RegQueryValueEx 🙄



  • [msdn]RegQueryValueEx[/msdn]



  • @surf: Du regst mich langsam auf. Erst sagt du, du hast Probleme mit Admin-Rechten, und jetzt geht es plötzlich doch???



  • ich hab no immer das problem mit admin recht.....nur das reinschreibn geht wenn ich admin bin...sonst ebn nicht!!!

    ich will die registry auslesen ob der schlüssel schon vorhanden ist:
    mach i das so:???????

    DWORD dwData = 256; 
    BYTE cDaten[256] = ""; 
    RegQueryValueEx(hKey,"Programm",0,0,cDaten,&dwData2);
    

    cu



  • die letzten beiden Parameter könntest du auch noch auf NULL bzw. 0 setzen 😉



  • DWORD dwData = 256;
    BYTE cDaten[256] = "";
    RegQueryValueEx(hKey,"Programm",0,0,0,0);

    wie kann ich jetzt rausfinden obs den schlüssel schon gibt?????

    if(......kein schlüssel
    dann schlüssel anlegen

    else
    keinen schlüssel anlegen da schlüssel schon vorhanden ist!!!!!!!!!!!



  • indem du den Rückgabewert überprüfst (ERROR_SUCCESS wenn alles glatt ging)



  • DWORD dwData = 256;
    int iLastError = 0;
    HKEY hkey;
    HKEY KEY = HKEY_LOCAL_MACHINE;

    BYTE cDaten[256] = "";
    iLastError = RegQueryValueEx(hKey,"Programm",0,0,0,0);

    if(!iLastError) // Wenn noch nicht in die Registry eingetragen wurde dann...
    {
    char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"};
    char name[100]= {"Programm"};
    char value[100]= {"C:\\Temp\\Programm.exe"};

    RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey);
    RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value));
    RegCloseKey(hkey);
    }



  • DWORD dwData = 256; 
    HKEY hkey; 
    HKEY KEY = HKEY_LOCAL_MACHINE; 
    
    BYTE cDaten[256] = ""; 
    long rOpen = RegQueryValueEx(hKey,"Programm",0,0,0,0); 
    // warum sind die Parameter am Schluss alle 0 ???
    
    // Wenn noch nicht in die Registry eingetragen wurde dann... 
    if(rOpen != ERROR_SUCCESS) 
        { 
            char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"}; 
            char name[100]= {"Programm"}; 
            char value[100]= {"C:\\Temp\\Programm.exe"}; 
    
            RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey); 
            RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value)); 
            RegCloseKey(hkey); 
        }
    


  • Das RegOpenKeyEx müsste imho vor RegQueryValueEx stehen.
    Warum sind alle Parameter NULL?: ganz einfach - du bist nicht an den Daten interessiert, sondern willst nur wissen, od der Wert existiert 😉 - cDaten brauchst du also gar nicht 🕶



  • ok ich glaub so passt es oder?

    HKEY hkey;
       HKEY KEY = HKEY_LOCAL_MACHINE;
       char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"};
       char name[100]= {"Programm"};
       char value[100]= {"C:\\Temp\\Programm.exe"};
    
       RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey);
       long rOpen = RegQueryValueEx(hkey,name,0,0,0,0);
    
       // Überprüfen ob der Schlüssel in der Registry schon vorhanden ist
       if(rOpen != ERROR_SUCCESS)
       {
            // In die Registry eintragen
            RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey);
            RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value));
        }
    
        RegCloseKey(hkey);
    

    kann man deiner meinung sonst noch was verbessern?

    cu



  • KEY_ALL_ACCESS

    Wunder Dich nicht, wenn ein Benutzer ohne Adminrechte Dein Programm benutzt, und es nicht funktioniert!

    - Du prüfst nicht, ob RegOpenKeyEx fehlschlägt (was beim "normalen" Benutzer mit KEY_ALL_ACCESS definitiv fehlschlägt)!
    - Den (evtl. ungültigen) hKey benutzt Du einfach so, egal ob es ein gültiger Handle ist
    - Selbiges bei RegSetValueEx -> hKey wird nicht auf Gültigkeit überprüft!



  • So wie dein Code derzeit ausseiht ist das 2. RegOpenKeyEx überflüssig / falsch bzw. es fehlt ein RegCloseKey.
    Falls du den Schüssel zuerst nur mit Lese-Berechtigung öffnest ist ein zweiter Aufruf von RegOpenKeyEx mit Schreib-Berechtigung schon ok, allerding fehlt dann eben wie gesagt das RegCloseKey für den 1. Aufruf von RegOpenKeyEx 😉



  • vielleicht hab ich glück und hab die rechte;-)
    cu



  • ich hab das nun so geändert:

    HKEY hkey;
       HKEY KEY = HKEY_LOCAL_MACHINE;
       char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\Run"};
       char name[100]= {"Programm"};
       char value[100]= {"C:\\Temp\\Programm.exe"};
    
       RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey);
       long rOpen = RegQueryValueEx(hkey,name,0,0,0,0);
       RegCloseKey(hkey);
    
       // Überprüfen ob der Schlüssel in der Registry schon vorhanden ist
       if(rOpen != ERROR_SUCCESS)
       {
            // In die Registry eintragen
            RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey);
            RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)value, strlen(value));
            ShowMessage("Schlüssel neu angelegt");
            RegCloseKey(hkey);
        }
    

    wie kann ich folgendes prüfen, ich glaub ich hab einen error:

    - prüfen, ob RegOpenKeyEx fehlschlägt
    - Den (evtl. ungültigen) hKey benutzt Du einfach so, egal ob es ein gültiger Handle ist
    - RegSetValueEx -> hKey auf Gültigkeit prüfen!

    cu surf..


Anmelden zum Antworten