VisualBasic Aus dynamischen Registry Pfad einen Schlüssel suchen und Wert ändern

BigO

Lt. Junior Grade
Registriert
Juli 2007
Beiträge
280
Hallo zusammen,

bin nun seit zwei Tagen an einem Problem dran was ich versuche mit VBS zu lösen.
Zu erst ein mal mein Ziel:
Habe ein Programm, welches beim starten schaut ob ein Aufnahmegerät angeschlossen ist und ob ein Ausgabegerät für den Sound vorhanden ist.
Ansich ja nicht schlecht. Problem ist, dass man mit dem Programm Audiobeiträge bearbeiten kann. Das Programm geht infolge dessen davon aus, dass ein Mikro vorhanden ist. Daher diese Abfrage nach den angeschlossenen Geräten.
Das Programm kann ich zum einem Hardwareseitig täuschen oder aber über Windows. Hardwareseitig ist aber zu aufwendig und kann auch schnell teuer werden. Daher ist es einfacher die Softwarelösung zu benutzen.

Diese sieht wie folgt aus:
Unter Windows die Aufnahmegeräte anzeigen lassen.
Dort dann über Rechtsklick "Deaktivierte Geräte anzeigen" alles anzeigen lassen.
Dann taucht auch das Gerät Stereomix auf. Wenn ich dieses dauerhaft aktiviere wird das oben erwähnte Programm ausgetrickst und denkt es sei alles was benötigt angeschlossen. Da ich keine Lust habe an etwa 500 Rechner hin zu gehen um dort diese Einstellung vorzunehmen war die Idee da es per Script auszuführen.

Habe daraufhin in der Windows Registry den Pfad gefunden welchen ich ändern muss um die gewünschte Einstellung zu setzen.

Habe auch schon etwas angefangen mit dem Programm nur komm ich nicht weiter warum es nicht Funktioniert.
Bin aber auch offen für andere Ideen und Sprachen. Jedoch sind meine Kenntnisse zur Zeit noch stark begrenzt weshalb ich auf die Hilfe von anderen angewiesen bin.
Code:
Const HKEY_LOCAL_MACHINE = &H80000002

strComputer = "."
strValueName = "DeviceState"
dwValue = "1"
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
 
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture\"
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
 
For Each subkey In arrSubKeys
        strRegKey = "\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture\"
        strRegKey1 = strRegKey & subkey
      		   
    oReg.GetDWORDValue HKEY_LOCAL_MACHINE, strRegKey1, strValueName, strValue   
    If strValue =  "268435457" then

	MsgBox ""

    End if
Next 
 
Wscript.Echo "Done!"

Unter dem Pfad "Capture" befinden sich halt einige cryptische Schlüssel ({26b826f7-f8ae-491c-b83b-c9248476f7b1})
Leider sind diese Schlüssel von Rechner zu Rechner unterschiedlich viele und auch unterschiedlich benannt.
In diesen Werten befinden sich Dezimalwerte(268435460).
Das Programm soll also die Schlüssel finde mit dem Inhalt 268435457 und diese dann durch eine 1 ersetzen.


Das ganze spielt sich unter Windows 7 64 Bit ab.

Herzlichen Dank schon einmal vor ab.

P.S. : Der bisherige Code wurde mittels Anfängerkenntnissen und ein wenig Hilfe von Dr. Google erstellt.

EDIT: Fehler aktuell ist übrigens, dass er nicht in die if abfrage kommt, da strValue keinen Wert bekommt
 
Zuletzt bearbeitet:
Lass dir mal alle Pfadbestandteile einzeln ausgeben. Meistens hat man ein Slash zu viel/wenig, bzw. weiß nicht/vergisst dass die Funktion noch welche hinzufügt...Des Weiteren stimmt der Datentyp von strValue vielleicht nicht. Sollte wohl eher ein Int sein?
http://msdn.microsoft.com/en-us/library/windows/desktop/aa390445%28v=vs.85%29.aspx

Aber mal eine Frage, aktuell gehst du alle Geräte durch und willst die aktivieren. Bist du sicher?
Meinem Verständnis der Registry nach ist jeder "cryptische Schlüssel" genau ein Gerät. Standardkomponenten haben aber meist immer einen fixen Schlüssel (teilweise auch über Win Versionen hinweg). Und Stereomix ist doch ein Standardgerät oder?
 
Stereomix hört sich zwar nach Windows an aber an 3 Rechnern woich es getestet habe kam Srereomix erst nach dem ich von realtek hd audio manager installiert habe kam die Möglichkeit stereomix dauerhaft zu aktivieren.Ziel ist es ja nur die Schlüssel zu ändern die am Ende die 57 haben.der Rest ist ja bei allen gleich solange sie nicht aktiviert sind.
Ergänzung ()

So nach etwas Veränderung geht die Suche nun schon mal. Jedoch bekomme ich immer noch bei dem Versuch den Wert zu ändern eine Fehlermeldung.
Ungültige Wurzel in Registrierungsschlüssel "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevice\Audio\Capture\....
Code:800700005
Quelle: WshShell.RegWrite

dadruch ist ja deutlich das es sich um die Wert Änderung handelt.
Code:
Const HKEY_LOCAL_MACHINE = &H80000002

strComputer = "."
strValueName = "\DeviceState"
dwValue = "1"
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture\"
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each subkey In arrSubKeys
strRegKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture\"
strRegKey1 = strRegKey & subkey

Set wso = CreateObject("WScript.Shell")
test = wso.RegRead("HKLM\" & strRegKey1 & strValueName)
Wscript.Echo test
IF test = "268435457" Then
Set wso = CreateObject("Wscript.Shell")
wso.RegWrite "HKLM\" &strRegKey1 & strValueName, "1", "REG_DWORD"

End if
Next

Wscript.Echo "Done!"
 
Kann es sein, das die Abkürzung "HKLM" nicht als Wurzel akzeptiert wird?
 
Nach ein paar weiteren Test kam heraus, dass das Script ansich Funktioniert. Nur bestehen angeblich nicht genügend Rechte um in HKLM zu schreiben?! was für HKLM spricht ist, dass die RegRead ohne Probleme funktioniert. und die ist auch mit HKLM geschrieben.
Denn unter HKCU funktioniert der RegWrite Befehl. Daher die Vermutung mit den Rechten.
 
Mit den Rechten liegst du richtig.
In HKLM darf man nur mit erhöhten Privilegien schreiben (lesen ist dagegen erlaubt).

Start doch mal ne Powershell oder cmd Session als Administrator und führ dein Skript von dort aus.
Sollte funktionieren.
 
Richtig, der Benutzer hat keine Schreibrechte. Hast du das Programm mal als Administrator gestartet?
 
Ah Okay es funktioniert wenn ich cmd als admin ausführe und dann darüber das script wird die Registry so geändert wie ich es gerne hätte.
Herzlichen Dank schon mal :)
Bleibt nur noch eine frage. kann ich das Script irgendwie so bearbeiten das es vor dem anmelden eines Benutzers ausgeführt wird? damit es quasi automatisiert ist ?
 
Zurück
Oben