function WMIReadValue($strRegkey, $strRegValueName )
dim $namespace, $objWMIService, $objRegistry
dim $hDefKey, $arrValuesName, $arrValuesType, $RegType, $wmiclass, $wmimethod
dim $objInParams, $objOutParams, $Parts, $counter, $tempkey
$Parts=Split($strRegKey,"\")
if $parts[0]="" and $parts[1]=""
$strComputer=$parts[2]
$counter=3
else
$strComputer= "."
endif
$hive=$parts[0+$counter]
for $i=$counter+1 to ubound($parts)
$tempkey=$tempkey + $parts[$i] + "\"
next
$strRegkey=left($tempkey,-1)
$WMIReadValue = ""
select
case vartype($hive)=8
select
case $Hive = "HKEY_CLASSES_ROOT" $hDefKey = (CDBL(2147483647)+1) ; &80000000
case $Hive = "HKCR" $hDefKey = (CDBL(2147483647)+1) ; &80000000
case $Hive = "HKEY_CURRENT_USER" $hDefKey = (CDBL(2147483647)+2) ; &80000001
case $Hive = "HKCU" $hDefKey = (CDBL(2147483647)+2) ; &80000001
case $Hive = "HKEY_LOCAL_MACHINE" $hDefKey = (CDBL(2147483647)+3) ; &80000002
case $Hive = "HKLM" $hDefKey = (CDBL(2147483647)+3) ; &80000002
case $Hive = "HKEY_USERS" $hDefKey = (CDBL(2147483647)+4) ; &80000003
case $Hive = "HKUS" $hDefKey = (CDBL(2147483647)+4) ; &80000003
case $Hive = "HKEY_CURRENT_CONFIG" $hDefKey = (CDBL(2147483647)+6) ; &80000005
case $Hive = "HKCC" $hDefKey = (CDBL(2147483647)+6) ; &80000005
case 1 exit -1
endselect
case vartype($hive)=5
$hDefKey = $hive
case 1 exit -1
endselect
;-- Connect to WMI --
$namespace = "root\default"
$objWMIService = GetObject('winmgmts:{impersonationLevel=impersonate,(debug,security)}!\\'+$strComputer+'\'+$namespace)
$wmiclass = "StdRegProv"
$objRegistry = $objWMIService.Get($wmiclass)
$wmimethod = "EnumValues"
$objInParams = $objRegistry.Methods_($wmimethod).InParameters.SpawnInstance_
$objInParams.hDefKey = $hDefKey
$objInParams.sSubKeyName = $strRegKey
$objInParams.sValueName = $strRegValueName
;-- Execute the method to read value in the registry --
$objOutParams = $objWMIService.ExecMethod( $wmiclass, $wmimethod, $objInParams )
if $objOutParams.ReturnValue <> 0
exit -3
endif
;-- search $strRegValueName in the array of value name returned --
$arrValuesName = $objOutParams.sNames
$arrValuesType = $objOutParams.Types
dim $i, $imax, $found
$found = 0
$i = -1
$imax = UBound($arrValuesName)
while $i < $imax
$i = $i + 1
if $strRegValueName = $arrValuesName[$i]
$RegType = $arrValuesType[$i]
select
case $RegType = 1 $wmimethod = "GetStringValue"
case $RegType = 2 $wmimethod = "GetExpandedStringValue"
case $RegType = 7 $wmimethod = "GetMultiStringValue"
case $RegType = 4 $wmimethod = "GetDwordValue"
case $RegType = 11 $wmimethod = "GetQwordValue"
case $RegType = 3 $wmimethod = "GetBinaryValue"
endselect
$i = $imax
$found = 1
endif
loop
if not $found
exit -4
endif
$objInParams = $objRegistry.Methods_($wmimethod).InParameters.SpawnInstance_
$objInParams.hDefKey = $hDefKey
$objInParams.sSubKeyName = $strRegKey
$objInParams.sValueName = $strRegValueName
;-- Execute the method to read value in the registry --
$objOutParams = $objWMIService.ExecMethod( $wmiclass, $wmimethod, $objInParams )
if $objOutParams.ReturnValue <> 0
exit $objOutParams.ReturnValue
endif
;-- get the Value parameter that is returned by method --
select
case $RegType = 1 $WMIReadValue = $objOutParams.sValue
case $RegType = 2 $WMIReadValue = $objOutParams.sValue
case $RegType = 7 $WMIReadValue = $objOutParams.sValue
case $RegType = 4 $WMIReadValue = $objOutParams.uValue
case $RegType = 11 $WMIReadValue = $objOutParams.uValue
case $RegType = 3 $WMIReadValue = $objOutParams.uValue
endselect
exit 0
endfunction