Deutsch
Forum

Registry-Wert löschen

 

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???
KompilierenMarkierenSeparieren
def @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#
waitkey

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  
 



Du öffnest den Schlüssel mit KEY_QUERRY_VALUE Zugriff (lesen), willst aber schreiben. Das geht nicht!
 
10.12.2005  
 




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) ausgeführt (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 für 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 für 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 für 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:
KompilierenMarkierenSeparieren
Def @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#
Waitkey
 
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):
KompilierenMarkierenSeparieren
Def @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&)
Waitkey
 
10.12.2005  
 



Ach ja, noch was zu dem Thema...
Die Eigenart ein Handle immer mit Vollzugriff (hier KEY_ALL_ACCESS=$1F003F) zu öffnen, sollte man möglichst sein lassen. Arbeitet ein User nicht als Admin, nimmt einem Windows solche faxen oft sehr übel...
 
10.12.2005  
 




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
proc ReadReg

    declare e%,e$
    e%=Set("Errorlevel",-1)
    e$=ReadIni$($(1),$(2),$(3))
    Set("Errorlvel",e%)
    Return e$

endproc


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:
KompilierenMarkierenSeparieren
Beispiel 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

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 möglich!!!

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...).
 
11.12.2005  
 



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.
 
11.12.2005  
 




Jac
de
Lad
Ah, ich wusste, dass ich auf die zählen kann. Solche speziellen Schlüssel werde ich sicher nicht brauchen. Trotzdem danke für 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  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.226 Betrachtungen

Unbenanntvor 0 min.
Andre Rohland31.01.2018
J. Strahl22.02.2012
Heinz Bernhard28.10.2011
Julian Schmidt11.08.2011

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

unbekannt (6x)
Jac de Lad (6x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie