senseless-creature
Goto Top

VBS soll Registry-Einträge finden und anpassen

Hi Leute,
ich habe mal wieder ein kleines Anfänger-Problem in VBS. Ich möchte über VBS den folgenden Schlüssel "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\"
nach weiteren Unterschlüsseln überprüfen. Diese finde ich auch recht einfach. Allerdings sind in den Unterschlüsseln weitere Unterschlüssel "0000" "0001" "0002" usw. vorhanden und darin möchte ich falls vorhanden allen Einträgen "EnableULPS" (DWORD) den Wert "0" vergeben. Leider komme ich hier nicht wirklich weiter..

Bisher bin ich hier
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."  
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _   
strComputer & "\root\default:StdRegProv")  
strKeyPath = "SYSTEM\CurrentControlSet\Control\Video"  
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys 
For Each subkey In arrSubKeys
Wscript.Echo "HKEY_LOCAL_MACHINE\" & strKeyPath & "\" & subkey & "\"   
Next


Ich bin für jeden Rat dankbar.
LG

Content-ID: 1264897212

Url: https://administrator.de/forum/vbs-soll-registry-eintraege-finden-und-anpassen-1264897212.html

Ausgedruckt am: 22.12.2024 um 14:12 Uhr

colinardo
Lösung colinardo 15.09.2021 aktualisiert um 20:07:56 Uhr
Goto Top
Servus,
wenn das nur in der nächsten Unterebene gesucht werden soll füge einfach eine weitere Vierschachtelung hinzu un enumeriere die Values dieser Ebene.
Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_DWORD = 4
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")  
strKeyPath = "SYSTEM\CurrentControlSet\Control\Video"  
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys 

For Each subkey In arrSubKeys
	oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey , arrSubKeys2  
	For Each subkey2 In arrSubKeys2
		oReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey & "\" & subkey2 , values, types  
		If Not IsNull(values) Then
			For i = 0 To UBound(values)
				If LCase(values(i)) = "enableulps" And types(i) = REG_DWORD Then  
					If oReg.SetDWORDValue(HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey & "\" & subkey2 , "EnableUlps", 0) = 0 Then  
						MsgBox "Changed 'EnableUlps' in '" & strKeyPath & "\" & subkey & "\" & subkey2 & "' to 0"  
					End If
					Exit For
				End If
			Next
		End If
	Next
Next
Soll es noch tiefer gesucht werden lässt sich das mit einer rekursiven Funktion abfackeln.

Grüße Uwe
Senseless-Creature
Senseless-Creature 15.09.2021 um 20:25:45 Uhr
Goto Top
Wow Dankeschön - bis auf die MSGBox funktioniert das perfekt face-smile
colinardo
colinardo 15.09.2021 aktualisiert um 20:28:02 Uhr
Goto Top
Zitat von @Senseless-Creature:

Wow Dankeschön - bis auf die MSGBox funktioniert das perfekt face-smile
Die hatte ich natürlich nur für deine Debug-Zwecke eingefügt face-wink.
Senseless-Creature
Senseless-Creature 15.09.2021 um 20:28:33 Uhr
Goto Top
Mein Fehler - die MSGBox funktioniert auch face-smile
Senseless-Creature
Senseless-Creature 15.09.2021 um 20:36:07 Uhr
Goto Top
Ich versuche die MSGBox gerade zu entfernen - jetzt bekomme ich ständig Fehler - kannst Du mir vielleicht nochmal unter die Arme greifen?
colinardo
colinardo 15.09.2021 aktualisiert um 20:41:39 Uhr
Goto Top
Zitat von @Senseless-Creature:

Ich versuche die MSGBox gerade zu entfernen - jetzt bekomme ich ständig Fehler - kannst Du mir vielleicht nochmal unter die Arme greifen?

Mein lieber Herr Gesangsverein ... da braucht wohl jemand einen starken Kaffee oder eine gehörige tracht mit CAT9 ;-/.

Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_DWORD = 4
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")  
strKeyPath = "SYSTEM\CurrentControlSet\Control\Video"  
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys 

For Each subkey In arrSubKeys
	oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey , arrSubKeys2  
	For Each subkey2 In arrSubKeys2
		oReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey & "\" & subkey2 , values, types  
		If Not IsNull(values) Then
			For i = 0 To UBound(values)
				If LCase(values(i)) = "enableulps" And types(i) = REG_DWORD Then  
					oReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey & "\" & subkey2 , "EnableUlps", 0  
					Exit For
				End If
			Next
		End If
	Next
Next
Senseless-Creature
Senseless-Creature 15.09.2021 um 20:48:44 Uhr
Goto Top
Hab´s gerade selbst hinbekommen, aber trotzdem vielen Dank face-smile
Kann man das mit der Enumerierung von Values unbegrenzt machen? Das ist ja total genial face-smile
LG
colinardo
colinardo 15.09.2021 aktualisiert um 21:30:48 Uhr
Goto Top
Zitat von @Senseless-Creature:
Kann man das mit der Enumerierung von Values unbegrenzt machen?
Klar, einfach eine rekursive Funktion draus machen.
https://stackoverflow.com/questions/10259170/vbscript-recursion-programm ...

z.B. so
Const HKEY_LOCAL_MACHINE = &H80000002
const REG_SZ = 1
const REG_EXPAND_SZ = 2
const REG_BINARY = 3
const REG_DWORD = 4
const REG_MULTI_SZ = 7
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")  
strKeyPath = "SYSTEM\CurrentControlSet\Control\Video"  

pathes = FindRegValue(HKEY_LOCAL_MACHINE,strKeyPath,"EnableUlps",REG_DWORD)  
If UBound(pathes) > 0 Then
	For Each path In pathes
		MsgBox "Changing value EnableUlps in '" & path & "'"  
		oReg.SetDWORDValue HKEY_LOCAL_MACHINE, path , "EnableUlps", 0  
	Next
Else
	MsgBox "No matching values found.", vbExclamation  
End If
Function FindRegValue(hive,path,value,valuetype)
	Dim arr
	arr = Array()
	oReg.EnumValues hive, path, values, types
	If Not IsNull(values) Then
		For i = 0 To UBound(values)
			If LCase(values(i)) = LCase(value) And types(i) = valuetype Then
				ReDim Preserve arr(UBound(arr)+1)
				arr(UBound(arr)) = path
				Exit For
			End If
		Next
	End If
	
	oReg.EnumKey hive, path , arrSubKeys
	If Not IsNull(arrSubKeys) Then
		For Each subkey In arrSubKeys
			result = FindRegValue(hive,path & "\" & subkey, value, valuetype)  
			If UBound(result) >= 0 Then
				For Each itm In result
					ReDim Preserve arr(UBound(arr)+1)
					arr(UBound(arr)) = itm
				Next
			End If
		Next
	End If
	FindRegValue = arr
End Function

Das ist ja total genial face-smile
Nö, einfachster Standard.

An deiner Stelle würde ich gleich auf die Powershell wechseln... weniger Tipparbeit für son' einfachen Stuss, da reicht ein Einzeiler:
ls HKLM:\SYSTEM\CurrentControlSet\Control\Video -Recurse | Get-ItemProperty -name EnableUlps -EA 0 | %{Set-ItemProperty $_.PSPath -Name EnableUlps -Value 0}
Senseless-Creature
Senseless-Creature 15.09.2021 um 20:54:09 Uhr
Goto Top
Wieder was gelernt - Vielen Dank für deine Hilfe face-smile
LG
Senseless-Creature
Senseless-Creature 16.09.2021 um 10:47:34 Uhr
Goto Top
Das Script funtioniert echt perfekt - wie könnte ich den DWORD denn anlegen, ohne diesen vorher abzufragen?
Unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\ gibt es auch wieder Unterschlüssel "0000" "0001" "0002" usw und dort möchte ich den DWORD "EnableULPS" auch anlegen, selbst wenn dieser einen anderen Wert hat oder nicht existiert, was aber mit

If LCase(values(i)) = "enableulps" And types(i) = REG_DWORD Then  
oReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey & "\" & subkey2 , "EnableUlps", 0  

So leider nicht funtioniert.

Kannst Du mir hier freundlicher Weise nochmal kurz unter die Arme greifen?
LG
colinardo
colinardo 16.09.2021 aktualisiert um 11:04:24 Uhr
Goto Top
Zitat von @Senseless-Creature:

Das Script funtioniert echt perfekt - wie könnte ich den DWORD denn anlegen, ohne diesen vorher abzufragen?
Unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\ gibt es auch wieder Unterschlüssel "0000" "0001" "0002" usw und dort möchte ich den DWORD "EnableULPS" auch anlegen, selbst wenn dieser einen anderen Wert hat oder nicht existiert, was aber mit

If LCase(values(i)) = "enableulps" And types(i) = REG_DWORD Then  
> oReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey & "\" & subkey2 , "EnableUlps", 0  

So leider nicht funtioniert.
Den überflüssigen Schmuh halt einfach weg lassen und den Subkey nur auf Mustervergleich prüfen.
Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_DWORD = 4
Set regex = CreateObject("vbscript.regexp")  
regex.IgnoreCase = True
regex.Pattern = "^\d+$"  
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")  
strKeyPath = "SYSTEM\CurrentControlSet\Control\Video"  
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys 

For Each subkey In arrSubKeys
	oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey , arrSubKeys2  
	For Each subkey2 In arrSubKeys2
		If regex.Test(subkey2) Then
			oReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath & "\" & subkey & "\" & subkey2 , "EnableUlps", 0  
		End If
	Next
Next
Ob das Vorhaben so sinnvoll ist, dazu sag ich hier mal jetzt nichts weiter das liegt in der Eigenverantwortung bei Registry-Manipulationen ...
Senseless-Creature
Senseless-Creature 16.09.2021 um 12:07:53 Uhr
Goto Top
Perfekt Dankeschön für deine Hilfe face-smile
LG