Regestry
-
thx für deine hilfe...........
schau mal:
das geht nicht:
http://www.tipps.delphi-source.de/system/tut20001003-2.shtml
ich bin hier nicht immer als admin eingeloggt!
was soll ich machen...???will nicht immer als admin einloggen um in die registry zu schreiben!!!!cu
-
Natürlich geht das nicht:
www.tipps.delphi-source.de schrieb:
Folgendermaßen muss man vorgehen, wenn man nur Lesezugriff haben will
Du musst schon richtig lesen. Du willst doch etwas in die Registry schreiben, also Schreibzugriff haben.
-
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 zuzugreifenaber 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
-
Möglicherweise die Lösung: http://www.c-plusplus.net/forum/viewtopic.php?t=39176
-
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 anlegenelse
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