Hallo zusammen
Ich muss mittels Visual Basic in der Registry auslesen, ob es bestimmter Key bereits vorhanden ist. (Wenn ja, keine SW-Installation - Wenn nein, Installation..)
Schwierigkeit: Das Script wird mit einem 32bit Agent ausgeführt also mit C:\Windows\SysWOW64\cmd.exe und sieht daher 32bit Registrystruktur. Der Teil, den ich auslesen muss, befindet sich allerdings in der 64bit Struktur.
Ich muss auslesen, ob der Key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\LMAgent vorhanden ist. Am besten eine Funktion, die allgemein gilt. Also dass man einen Übergabewert (Key) übergeben kann, welcher dann von der Funktion geprüft wird..
Ich habe schon einiges ausprobiert mit StdRegProv und EnumValues, aber bin bisher immer gescheitert.
Kann mir da evlt. jemand weiterhelfen? Hat da jemand Erfahrung?
Meine angefangene Funktion:
Function KeyExists64(sRegHive, sRegKey, sArchtct)
Dim objCtx, objLocator, objServices, objStdRegProv, Inparams, Outparams, array, value
Dim Method
fRcode = -1
On Error Resume Next
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", sArchtct
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")
Method = "EnumKey"
Set Inparams = objStdRegProv.Methods_(Method).Inparameters
Inparams.Hdefkey = sRegHive
Inparams.Ssubkeyname = sRegKey
'Inparams.Svaluename = sRegValue
WScript.Echo fRcode
Set Outparams = objStdRegProv.ExecMethod_(Method,Inparams,,objCtx)
For each value In Outparams
WScript.Echo value
Next
WScript.Echo Outparams.ReturnValue
fRcode = Outparams.ReturnValue
set objCtx = Nothing
set objLocator = Nothing
Meine Funktion um Values auszulesen:
Function ReadRegEntry64(sRegHive, sRegKey, sRegValue, sKeyType, sArchtct)
Dim objCtx, objLocator, objServices, objStdRegProv, Inparams, Outparams
Dim Method
fRcode = -1
On Error Resume Next
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", sArchtct
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")
Select Case sKeyType
Case "REG_SZ"
Method = "GetStringValue"
Set Inparams = objStdRegProv.Methods_(Method).Inparameters
Inparams.Hdefkey = sRegHive
Inparams.Ssubkeyname = sRegKey
Inparams.Svaluename = sRegValue
Set Outparams = objStdRegProv.ExecMethod_(Method,Inparams,,objCtx)
ReadRegEntry64 = Outparams.sValue
fRcode = Outparams.ReturnValue
Case "REG_DWORD"
Method = "GetDWORDValue"
Set Inparams = objStdRegProv.Methods_(Method).Inparameters
Inparams.Hdefkey = sRegHive
Inparams.Ssubkeyname = sRegKey
Inparams.Svaluename = sRegValue
Set Outparams = objStdRegProv.ExecMethod_(Method,Inparams,,objCtx)
ReadRegEntry64 = Outparams.uValue
fRcode = Outparams.ReturnValue
Case Else
Rcode = 1234
Exit Function
End Select
set objCtx = Nothing
set objLocator = Nothing
End Function
Funktion um Key auszulesen, aber auf 32bit Struktur (bzw. auf 64Bit Struktur mit "korrekten" CMD)
Option Explicit
Const hklm = &H80000002
Const strComputer = "."
Const regPath = "SOFTWARE\Clients"
Dim arrayRegKeys, value, objRegSet
objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
objReg.EnumKey hklm, regPath, arrayRegKeys
For Each value In arrayRegKeys
WScript.Echo value
Next
Vielen herzlichen Dank für die Hilfe
Schönes Wochenende!
ynick
Ich muss mittels Visual Basic in der Registry auslesen, ob es bestimmter Key bereits vorhanden ist. (Wenn ja, keine SW-Installation - Wenn nein, Installation..)
Schwierigkeit: Das Script wird mit einem 32bit Agent ausgeführt also mit C:\Windows\SysWOW64\cmd.exe und sieht daher 32bit Registrystruktur. Der Teil, den ich auslesen muss, befindet sich allerdings in der 64bit Struktur.
Ich muss auslesen, ob der Key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\LMAgent vorhanden ist. Am besten eine Funktion, die allgemein gilt. Also dass man einen Übergabewert (Key) übergeben kann, welcher dann von der Funktion geprüft wird..
Ich habe schon einiges ausprobiert mit StdRegProv und EnumValues, aber bin bisher immer gescheitert.
Kann mir da evlt. jemand weiterhelfen? Hat da jemand Erfahrung?
Meine angefangene Funktion:
Function KeyExists64(sRegHive, sRegKey, sArchtct)
Dim objCtx, objLocator, objServices, objStdRegProv, Inparams, Outparams, array, value
Dim Method
fRcode = -1
On Error Resume Next
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", sArchtct
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")
Method = "EnumKey"
Set Inparams = objStdRegProv.Methods_(Method).Inparameters
Inparams.Hdefkey = sRegHive
Inparams.Ssubkeyname = sRegKey
'Inparams.Svaluename = sRegValue
WScript.Echo fRcode
Set Outparams = objStdRegProv.ExecMethod_(Method,Inparams,,objCtx)
For each value In Outparams
WScript.Echo value
Next
WScript.Echo Outparams.ReturnValue
fRcode = Outparams.ReturnValue
set objCtx = Nothing
set objLocator = Nothing
Meine Funktion um Values auszulesen:
Function ReadRegEntry64(sRegHive, sRegKey, sRegValue, sKeyType, sArchtct)
Dim objCtx, objLocator, objServices, objStdRegProv, Inparams, Outparams
Dim Method
fRcode = -1
On Error Resume Next
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", sArchtct
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")
Select Case sKeyType
Case "REG_SZ"
Method = "GetStringValue"
Set Inparams = objStdRegProv.Methods_(Method).Inparameters
Inparams.Hdefkey = sRegHive
Inparams.Ssubkeyname = sRegKey
Inparams.Svaluename = sRegValue
Set Outparams = objStdRegProv.ExecMethod_(Method,Inparams,,objCtx)
ReadRegEntry64 = Outparams.sValue
fRcode = Outparams.ReturnValue
Case "REG_DWORD"
Method = "GetDWORDValue"
Set Inparams = objStdRegProv.Methods_(Method).Inparameters
Inparams.Hdefkey = sRegHive
Inparams.Ssubkeyname = sRegKey
Inparams.Svaluename = sRegValue
Set Outparams = objStdRegProv.ExecMethod_(Method,Inparams,,objCtx)
ReadRegEntry64 = Outparams.uValue
fRcode = Outparams.ReturnValue
Case Else
Rcode = 1234
Exit Function
End Select
set objCtx = Nothing
set objLocator = Nothing
End Function
Funktion um Key auszulesen, aber auf 32bit Struktur (bzw. auf 64Bit Struktur mit "korrekten" CMD)
Option Explicit
Const hklm = &H80000002
Const strComputer = "."
Const regPath = "SOFTWARE\Clients"
Dim arrayRegKeys, value, objRegSet
objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
objReg.EnumKey hklm, regPath, arrayRegKeys
For Each value In arrayRegKeys
WScript.Echo value
Next
Vielen herzlichen Dank für die Hilfe
Schönes Wochenende!
ynick
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ynick“ ()