| |
|
|
Jac de Lad | Hallöle, ich will einen Wert in der Registry löschen. Bei mir funzt das folgende aber nicht. Gibts da nen Fehler??? KompilierenMarkierenSeparierendef @RegOpenKeyEx(5) !"ADVAPI32","RegOpenKeyExA"
def @RegDeleteValue(2) !"ADVAPI32","RegDeleteValueA"
def @RegCloseKey(1) !"ADVAPI32","RegCloseKey"
declare Handle#
dim handle#,4
declare Key#
dim Key#,100
string Key#,0="SoftwareMicrosoftWindowsCurrentVersionRun" Pfad des Zielschlüssels
declare name#
dim Name#,100
string Name#,0="Fraps" Name des zu löschenden Wertes
print @RegOpenKeyEx($80000001,Key#,0,1,Handle#) $80000001=HK_Current_User
print @RegDeleteValue(@Long(Handle#,0),Name#)
print @RegCloseKey(@Long(Handle#,0))
dispose Handle#
dispose Key#
dispose Name#
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 10.12.2005 ▲ | |
|
|
|
|
| Du öffnest den Schlüssel mit KEY_QUERRY_VALUE Zugriff (lesen), willst aber schreiben. Das geht nicht! |
|
|
| |
|
|
|
Jac de Lad | Hm, ok, und wie mache ichs richtig???
Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 10.12.2005 ▲ |
|
|
|
|
Jac de Lad | Ahh! Ich habs schon gefunden.
Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 10.12.2005 ▲ |
|
|
|
|
| Kurze Erklärung, dann kommst du demnächst vielleicht selbst zurecht Es geht um Parameter 4 von RegOpenKeyEx:
Unter NT/2000/XP sind viele Objekte (Handles) mit einer Zugriffskontrolle versehen. Man muß beim Öfffnen des Handles dabei eine Hexadezimale Zahl angegen (Flag), die angiebt, wie man das Handle öffnen möchte (schreiben, lesen, Vollzugriff...). Das ist hier der Parameter 4 von RegOpenKeyEx. Das OS überprüft dann zuerst, ob der aufrufende User überhaupt das Recht dazu hat, das Handle in der angeforderten Art und Weise zu öffnen. Welche Rechte der jeweilige User geanau auf das Handle besitzt, steht im Security-Descriptor der dem jeweiligen Objekt zugeordnet ist. Hat er die angeforderten Rechte nicht, schlägt das Öffnen des Handles fehl.
Wird später eine Funktion mit dem Handle (Speicherbereich) corsa (hier RegDeleteValue), schlägt diese Funktion dann fehl, wenn das Handle nicht in entsprechender Weise geöffnet wurde.
Arten von Zugriffsflags: Microsoft teilt diese Flags, die bestimmen, wie ein Handle zu öffnen ist, in drei Arten ein=>
1.) Spezifische Rechte Jedes Objekt hat unterschiedliche Eigenschaften und kann deshalb in unterschiedlicher Art und Weise geöffnet werden. Spezifische Rechte per Registryschlüssel sind: $1=KEY_QUERY_VALUE=Wert lesen $2=KEY_SET_VALUE=Wert schreiben $4=KEY_CREATE_SUB_KEY=Unterschlüssel erstellen $8=KEY_ENUMERATE_SUB_KEYS=Unterschlüssel auflisten $10=KEY_NOTIFY=Über Änderungen benachrichtigen $20=KEY_CREATE_LINK=Symbolischen Link erstellen
2.) Generic Rechte Da es Zig Arten von zugriffsbeschränkten Handles gibt, wäre kaum ein Programmierer in der Lage, sich das alles zu merken und überhaupt Programme zu entwickeln. Es gibt deshalb noch die Generic Flags, die per jedes Handle gleich und quasi eine Umsetzung der spezifischen Rechte und Standardrechte sind: $10000000=GENERIC_ALL=Vollzugriff $80000000=GENERIC_READ=Kompletter Lesezugriff $40000000=GENERIC_WRITE=Kompletter Schreibzugriff $20000000=GENERIC_EXECUTE=Ausführen
3.)Standardrechte Natürlich gibt es auch Flags, die per alle Handles gleich sind: $40000=WRITE_DAC=Im Security-Descriptor Zugriffsrechte ändern $80000=WRITE_OWNER=Eigentümer eines Objektes ändern (der Eigentümer hat immer erweiterte Zugriffsrechte). $20000=READ_CONTROL=Auslesen der bestehenden Zugriffsrechte aus einem Security-Descriptor $10000=_DELETE=Löschen $100000=SYNCHRONIZE=Warten, bis ein Handle bereit ist
Ist alles im Prinzip ganz einfach - und wie du aus deinem Problem wohl gelernt hast, ist es auch sehr sehr wichtig das zu wissen, wenn man auf neueren Betriebssystemen Programme schreiben will (unter 95/98/ME kannst du das getrost alles vergessen)...
Hier der geänderte Code: KompilierenMarkierenSeparierenDef @Regopenkeyex(5) !"ADVAPI32","RegOpenKeyExA"
Def @Regdeletevalue(2) !"ADVAPI32","RegDeleteValueA"
Def @Regclosekey(1) !"ADVAPI32","RegCloseKey"
Declare Handle#
Dim Handle#,4
Declare Key#
Dim Key#,100
String Key#,0="SoftwareMicrosoftWindowsCurrentVersionRun" Pfad des Zielschlüssels
Declare Name#
Dim Name#,100
String Name#,0="Fraps" Name des zu löschenden Wertes
Print @Regopenkeyex($80000001,Key#,0,$2,Handle#)$80000001=HK_Current_User
Print @Regdeletevalue(@Long(Handle#,0),Name#)
Print @Regclosekey(@Long(Handle#,0))
Dispose Handle#
Dispose Key#
Dispose Name#
| 10.12.2005 ▲ | |
|
|
|
|
| Ich hab gerade gelesen, daß du XProfan besitzt. Ab Profan² 7 kannst du bei APIs statt der Bereiche auch Adressen von Variablen angeben (nur, wenn irgendwo ein String zurückgeliefert wird, solltest du das unterlassen): KompilierenMarkierenSeparierenDef @Regopenkeyex(5) !"ADVAPI32","RegOpenKeyExA"
Def @Regdeletevalue(2) !"ADVAPI32","RegDeleteValueA"
Def @Regclosekey(1) !"ADVAPI32","RegCloseKey"
Declare Handle&,Key$,Name$
LET Key$="SoftwareMicrosoftWindowsCurrentVersionRun" Pfad des Zielschlüssels
LET Name$="Fraps" Name des zu löschenden Wertes
Print @Regopenkeyex($80000001,@ADDR(Key$),0,$2,@ADDR(HANDLE&))$80000001=HK_Current_User
Print @Regdeletevalue(Handle&,@ADDR(Name$))
Print @Regclosekey(HANDLE&)
Wa /a>
|
|
|
| |
|
|
|
| Ach ja, noch was zu dem Thema... Die Eigenart ein Handle immer mit Vollzugriff (hier KEY_ALL_ACCESS=$1F003F) zu öffnen, sollte man possibile sein lassen. Arbeitet ein User nicht als Admin, nimmt einem Windows solche faxen oft sehr übel... |
|
|
| |
|
|
|
Jac de Lad | Aha.
Hm, wie gesagt, ich hatte das Problem schon selbst gefunden. Aber dann gleich zu meiner nächsten Frage: Ich bin sicher nicht der einzige mit dem Problem, Registry-Werte zu lesen, die eventuell nicht vorhanden sind, dann gibts nen bösen Fehler. Den kann man ja folgendermaßen umgehen: KompilierenMarkierenSeparieren Das ging bis jetzt ganz prima. Nun habe ich aber seit heute XProfan 9. Da geht das im Interpreter auch noch problemlos, aber mit der Runtime kommen auf einmal zwei böse Fehler. Kann man das mit APis realisieren? Mit RegKeyOpenEx und so...
Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 10.12.2005 ▲ |
|
|
|
|
Jac de Lad | @AH:
So, hier hat sich schon wieder einiges geändert:
Das mit dem Einkürzen ist klar. Ich machs aber trotzdem immer zuerst mit Bereichen und kürze es dann ein, wenns funktioniert. Trotzdem danke. Jetzt habe ich aber festgestellt, dass das Problem an Set(Errorlevel... liegt. Aber wenn du mir sagen könntest, wie das mit APIs funktioniert, würde sich das Problem ja erübrigen. Das mit dem Vollzugriff und so werde ich mir zu Herzen nehmen!
Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 10.12.2005 ▲ |
|
|
|
|
| So: KompilierenMarkierenSeparierenBeispiel zu api_RegQueryValueExA,ADVAPI32
Declare Handle#,Fehler&,Key#,Name#,Wert#,Size#,Type#
Def @Regopenkeyex(5) !"ADVAPI32","RegOpenKeyExA"
Def @Regqueryvalueex(6) !"ADVAPI32","RegQueryValueExA"
Def @Regclosekey(1) !"ADVAPI32","RegCloseKey"
Windowstyle 31
Windowtitle "Aus Registry Startmenüname auslesen"
Window 0,0-640,440
Dim Key#,260
Dim Handle#,4
Dim Name#,250
Dim Size#,4
Dim Wert#,260
Dim Type#,4
String Key#,0="SoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders"
Let Fehler&=@Regopenkeyex($80000001,Key#,0,$F003f,Handle#)
Print "Fehlercode beim Öffenen des Schlüssels User Shell Folders: ";Fehler&
If Fehler&=0
String Name#,0="Start Menu"
Long Size#,0=260
Let Fehler&=@Regqueryvalueex(@Long(Handle#,0),Name#,0,Type#,Wert#,Size#)
Print "Fehlercode beim Auslesen des Schlüssels: ";Fehler&
Print ""
Print "Das Startmenü des aktuellen Users steht hier: "
Print @String$(Wert#,0)
Print "Typ des Schlüssels: ";@Long(Type#,0)
Print "Länge des Wertes: ";@Long(Size#,0);" Bytes"
Print ""
Print "Fehlercode RegCloseKey: ";@Regclosekey(@Long(Handle#,0))
Endif
If Fehler&<>0
String Key#,0="SoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders"
Let Fehler&=@Regopenkeyex($80000001,Key#,0,$1,Handle#)
Print "Fehlercode beim Öffenen des Schlüssels Shell Folders: ";Fehler&
String Name#,0="Start Menu"
Long Size#,0=260
Let Fehler&=@Regqueryvalueex(@Long(Handle#,0),Name#,0,Type#,Wert#,Size#)
Print "Fehlercode beim Auslesen des Schlüssels: ";Fehler&
Print ""
Print "Das Startmenü des aktuellen Users steht hier: "
Print @String$(Wert#,0)
Print "Typ des Schlüssels: ";@Long(Type#,0)
Print "Länge des Wertes: ";@Long(Size#,0);" Bytes"
Print ""
Print "Fehlercode RegCloseKey: ";@Regclosekey(@Long(Handle#,0))
Endif
If Fehler&<>0
Print "Fehler!!!!!! Startmenü konnte nicht ausgelesen werden!!!"
Endif
Dispose Type#
Dispose Wert#
Dispose Key#
Dispose Handle#
Dispose Name#
Dispose Size#
While 0=0
Waitinput
ass=s4 href='./../../function-references/xprofan/wend/'>Wend
1.) Mit RegOpenKeyEx den Schlüssel mit dem Flag $1 zum lesen öffnen. Hier auf keinen Fall den Schlüssel mit $F003F=Vollzugriff sondern wirklich nur mit $1=KEY_QUERY_VALUE öffnen! Läuft dein Programm in einem User Account und nicht mit Adminrechten, ist sonst das Auslesen von Schlüsseln unter HKEY_LOCAL_MACHINE nicht possibile!!!
2 Mit RegQueryValueEx Wert auslesen (egal welche Art - String, Struktur oder Doubleword...). Parameter 4 Empfängt einen Flag, der angibt welche Art von Wert ausgelesen wurde (String, Doubleword...). |
|
|
| |
|
|
|
| Ach ja...
Einige Registryschlüssel kannst du selbst als Administrator nicht ohne weiteres auslesen. Dazu gehören unter anderem beispielsweise der Schlüssel HKEY_LOCAL_MACHINESAMSAMDOMAINS und der besonders von mir geliebte Schlüssel HKEY_LOCAL_MACHINESecurityPolicyAccounts. |
|
|
| |
|
|
|
Jac de Lad | Ah, ich wusste, dass ich auf die zählen kann. Solche speziellen Schlüssel werde ich sicher nicht brauchen. Trotzdem danke per deine Mühe,
schönen Sonntag noch, Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 11.12.2005 ▲ |
|
|
|