Hi all, welcome back,
Today I'll share with you a couple of VBScript samples I developed the other day. They use WMI and its StdRegProv class to read the Windows registry.
This sample will take a registry key and show its subkeys and the values within those subkeys:
' Constants (taken from WinReg.h) ' Const HKEY_CLASSES_ROOT = &H80000000 Const HKEY_CURRENT_USER = &H80000001 Const HKEY_LOCAL_MACHINE = &H80000002 Const HKEY_USERS = &H80000003 Const REG_SZ = 1 Const REG_EXPAND_SZ = 2 Const REG_BINARY = 3 Const REG_DWORD = 4 Const REG_MULTI_SZ = 7 ' Chose computer name, registry tree and key path ' strComputer = "." ' Use . for current machine hDefKey = HKEY_LOCAL_MACHINE strKeyPath = "SOFTWARE\Microsoft\Cryptography\Defaults\Provider" ' Connect to registry provider on target machine with current user ' Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") ' Enum the subkeys of the key path we've chosen ' oReg.EnumKey hDefKey, strKeyPath, arrSubKeys For Each strSubkey In arrSubKeys ' Show the subkey ' wscript.echo strSubkey ' Show its value names and types ' strSubKeyPath = strKeyPath & "\" & strSubkey oReg.EnumValues hDefKey, strSubKeyPath, arrValueNames, arrTypes For i = LBound(arrValueNames) To UBound(arrValueNames) strValueName = arrValueNames(i) Select Case arrTypes(i) ' Show a REG_SZ value ' Case REG_SZ oReg.GetStringValue hDefKey, strSubKeyPath, strValueName, strValue wscript.echo " " & strValueName & " (REG_SZ) = " & strValue ' Show a REG_EXPAND_SZ value ' Case REG_EXPAND_SZ oReg.GetExpandedStringValue hDefKey, strSubKeyPath, strValueName, strValue wscript.echo " " & strValueName & " (REG_EXPAND_SZ) = " & strValue ' Show a REG_BINARY value ' Case REG_BINARY oReg.GetBinaryValue hDefKey, strSubKeyPath, strValueName, arrBytes strBytes = "" For Each uByte in arrBytes strBytes = strBytes & Hex(uByte) & " " Next wscript.echo " " & strValueName & " (REG_BINARY) = " & strBytes ' Show a REG_DWORD value ' Case REG_DWORD oReg.GetDWORDValue hDefKey, strSubKeyPath, strValueName, uValue wscript.echo " " & strValueName & " (REG_DWORD) = " & CStr(uValue) ' Show a REG_MULTI_SZ value ' Case REG_MULTI_SZ oReg.GetMultiStringValue hDefKey, strSubKeyPath, strValueName, arrValues wscript.echo " " & strValueName & " (REG_MULTI_SZ) =" For Each strValue in arrValues wscript.echo " " & strValue Next End Select Next Next
But what if we only need to know if a registry key exists? We could just do the following:
' Constants (taken from WinReg.h) ' Const HKEY_CLASSES_ROOT = &H80000000 Const HKEY_CURRENT_USER = &H80000001 Const HKEY_LOCAL_MACHINE = &H80000002 Const HKEY_USERS = &H80000003 ' Chose computer name, registry tree and key path ' strComputer = "." ' Use . for current machine hDefKey = HKEY_LOCAL_MACHINE strKeyPath = "SOFTWARE\Microsoft\Cryptography\Defaults\Provider" ' Connect to registry provider on target machine with current user ' Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") ' Try to enum the subkeys of the key path we've chosen. We can't if the key doesn't exist ' If oReg.EnumKey(hDefKey, strKeyPath, arrSubKeys) = 0 Then wscript.echo "Key exists!" Else wscript.echo "Key does not exists!" End If
I hope this helps.
Cheers,
Alex (Alejandro Campos Magencio)
This worked for me.
I had to add in 'On Error Resume Next' though or it would error on subkeys with only the Default entry inside.
I actually used it to get a list of installed software, much faster than using WMI's WIN32_Product.