Problem mit RegEnumKeyNames

Bereich für allgemeine Beiträge.
Antworten
R2D2
Beiträge: 12
Registriert: Fr 23. Okt 2009, 17:53

Problem mit RegEnumKeyNames

Beitrag von R2D2 »

Hallo,

mit folgender gescripteten Eigenschaft habe ich ein Problem. Obwohl bei mir in dem Schlüssel zwei Werte drin stehen, liefert mir dieses Script kein Ergebnis. Und zwar kommt er gar nicht erst in die Schleife rein (kann man ja recht einfach mit msgbox("Test") testen).

Code: Alles auswählen

Function BeforeScan()
Dim Key
Dim Wert

For Each Key In RegEnumKeyNames("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run")
  Wert = RegGetValue("HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", Key.Name)
  SetProperty "Autostart "&Key.Name, Wert
Next
End Function
WernerB
Beiträge: 112
Registriert: Mo 20. Jul 2009, 07:41

Re: Problem mit RegEnumKeyNames

Beitrag von WernerB »

Die Werte der Autorun-Einträge in einzelne geskriptete Eigenschaften zu schreiben, deren Namen aus den Autorun-Einträgen gebildet werden, ist keine schlechte Idee. :geek: Man muss nur berücksichtigen, dass die maximale Zahl verschiedener Eigenschaften durch die verwendete Datenbank beschränkt ist. Bei der voreingestellen Jet-Engine sind das ca. 250.

Zum Code: Da es sich um Benutzereinstellungen (HKEY_CURRENT_USER) handelt, muss der Aufruf in der Funktion BeforeUserScan() erfolgen. Diese Funktion wird für jeden Benutzer aufgerufen, der an dem Rechner gerade angemeldet ist.
Desweiteren handelt es sich bei den einzelnen Autostart-Einträgen um Werte (erscheinen auf der rechten Seite im Regedit) und keine Schlüssel.

Folgender Code sollte funktionieren:

Code: Alles auswählen

Function BeforeUserScan()
  Dim WertName, Wert

  For Each WertName In RegEnumValueNames("HKCU\Software\Microsoft\Windows\CurrentVersion\Run")
    Wert = RegGetValue("HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", WertName)
    SetProperty "Autostart " & WertName, Wert
  Next
End Function
R2D2
Beiträge: 12
Registriert: Fr 23. Okt 2009, 17:53

Re: Problem mit RegEnumKeyNames

Beitrag von R2D2 »

Danke Werner, jetzt geht's.

Ich verstehe nur den Unterschied zwischen RegEnumKeys und RegEnumKeyNames nicht.

Sehe ich das richtig, dass RegEnumKeys ein Array der Unterschlüssel als Objekt liefert und RegEnumKeyNames ein Array der Schlüsselnamen (als String)?

Wäre schön, wenn ihr das im Handbuch bißchen erläutern könntet. Ich habe mal ein Testscript gemacht, um mir über die Bedeutung klar zu werden:

Code: Alles auswählen

Function BeforeUserScan()

  Dim Key, KeyName, Ausgabe

  For Each KeyName In RegEnumKeyNames("HKCU\Software\Microsoft\Windows")
    Ausgabe = Ausgabe + KeyName + ","
  Next
  SetProperty "Test1" , Ausgabe

  Ausgabe = ""
  For Each Key In RegEnumKeys("HKCU\Software\Microsoft\Windows")
    Ausgabe = Ausgabe + Key.name + ","
  Next
  SetProperty "Test2" , Ausgabe

End Function
WernerB
Beiträge: 112
Registriert: Mo 20. Jul 2009, 07:41

Re: Problem mit RegEnumKeyNames

Beitrag von WernerB »

Stimmt, RegEnumKeys und RegEnumKeyNames unterschieden sich dadurch, dass letzteres nur die Namen als Array von Strings zurückgibt und ersteres ein Array von Registry-Objekten.

Das Registry-Objekt kapselt das Registry-Handle des Betriebssystems. Wenn man viele Operationen auf den gleichen Registry-Key ausführt (z.B. alle Unterwerte durchgehen), muss das Handle nicht jedes mal neu erzeugt werden, was vor allem über das Netzwerk den Vorgang beschleunigt.

So kann man die Autostart-Abfrage von oben auch wie folgt schreiben:

Code: Alles auswählen

Function BeforeUserScan()
  Dim WertName, Wert
  Dim SchluesselObjekt
  Set SchluesselObjekt=RegOpenKey("HKCU\Software\Microsoft\Windows\CurrentVersion\Run")
  For Each WertName In SchluesselObjekt.ValueNames
    Wert = SchluesselObjekt.GetValue(WertName)
    SetProperty "Autostart " & WertName, Wert
  Next
End Function
Antworten