Rob van der Woude's Scripting Pages

VBScript Scripting Techniques > Registry > WMI StdRegProv

Work with the

Registry

 

WMI StdRegProv
VBScript Code:
Because of its length, only the code for the function itself is shown on this page.
The demo script that shows how to use this function is available as a separate download.
Function ReadRegValue( myComputer, myRegPath, myRegValue )
' This function reads a value from the registry of any WMI
' enabled computer.
'
' Arguments:
' myComputer        a computer name or IP address,
'                   or a dot for the local computer
' myRegPath         a full registry key path, e.g.
'                   HKEY_CLASSES_ROOT\.jpg or
'                   HKLM\SOFTWARE\Microsoft\DirectX
' myRegValue        the value name to be queried, e.g.
'                   InstalledVersion or "" for default
'                   values
'
' The function returns an array with the following elements:
' ReadRegValue(0)   the computer name (the first argument)
' ReadRegValue(1)   the hive number (see const declarations)
' ReadRegValue(2)   the key path without the hive
' ReadRegValue(3)   the value name (the third argument)
' ReadRegValue(4)   the error number: 0 means no error
' ReadRegValue(5)   the data type of the result
' ReadRegValue(6)   the actual data, or the first element of an
'                   array of data for REG_BINARY or REG_MULTI_SZ
'
' Written by Rob van der Woude
' http://www.robvanderwoude.com


    ' Standard housekeeping
    Const HKEY_CLASSES_ROOT              = &H80000000
    Const HKEY_CURRENT_USER              = &H80000001
    Const HKEY_LOCAL_MACHINE             = &H80000002
    Const HKEY_USERS                     = &H80000003
    Const HKEY_CURRENT_CONFIG            = &H80000005
    Const HKEY_DYN_DATA                  = &H80000006 ' Windows 95/98 only

    Const REG_SZ                         =  1
    Const REG_EXPAND_SZ                  =  2
    Const REG_BINARY                     =  3
    Const REG_DWORD                      =  4
    Const REG_DWORD_BIG_ENDIAN           =  5
    Const REG_LINK                       =  6
    Const REG_MULTI_SZ                   =  7
    Const REG_RESOURCE_LIST              =  8
    Const REG_FULL_RESOURCE_DESCRIPTOR   =  9
    Const REG_RESOURCE_REQUIREMENTS_LIST = 10
    Const REG_QWORD                      = 11

    Dim arrRegPath, arrResult(), arrValueNames, arrValueTypes
    Dim i, objReg, strHive, valRegError, valRegType, valRegVal

    ' Assume no error, for now
    valRegError = 0

    ' Split the registry path in a hive part
    ' and the rest, and check if that succeeded
    arrRegPath = Split( myRegPath, "\", 2 )
    If IsArray( arrRegPath ) Then
        If UBound( arrRegPath ) <> 1 Then valRegError = 5
    Else
        valRegError = 5
    End If

    ' Convert the hive string to a hive number
    Select Case UCase( arrRegPath( 0 ) )
        Case "HKCR", "HKEY_CLASSES_ROOT"
            strHive = HKEY_CLASSES_ROOT
        Case "HKCU", "HKEY_CURRENT_USER"
            strHive = HKEY_CURRENT_USER
        Case "HKLM", "HKEY_LOCAL_MACHINE"
            strHive = HKEY_LOCAL_MACHINE
        Case "HKU",  "HKEY_USERS"
            strHive = HKEY_USERS
        Case "HKCC", "HKEY_CURRENT_CONFIG"
            strHive = HKEY_CURRENT_CONFIG
        Case "HKDD", "HKEY_DYN_DATA"
            strHive = HKEY_DYN_DATA
        Case Else
            valRegError = 5
    End Select

    ' Abort if any error occurred, and return an error code
    If valRegError > 0 Then
        ReadRegValue = Array( myComputer, myRegPath, _
                              myRegPath, myRegValue, _
                              valRegError, "-", "-" )
        Exit Function
    End If

    ' Initiate custom error handling
    On Error Resume Next

    ' Create a WMI registry object
    Set objReg = GetObject( "winmgmts:{impersonationLevel=impersonate}!//" _
               & myComputer & "/root/default:StdRegProv" )

    ' Abort on failure to create the object
    If Err Then
        valRegError = Err.Number
        Err.Clear
        On Error Goto 0
        ReadRegValue = Array( myComputer, myRegPath, _
                              myRegPath, myRegValue, _
                              valRegError, "-", "-" )
        Exit Function
    End If

    ' Get a list of all values in the registry path;
    ' we need to do this in order to find out the
    ' exact data type for the requested value
    objReg.EnumValues strHive, arrRegPath( 1 ), arrValueNames, arrValueTypes

    ' If no values were found, we'll need to retrieve a default value
    If Not IsArray( arrValueNames ) Then
        arrValueNames = Array( "" )
        arrValueTypes = Array( REG_SZ )
    End If

    If Err Then
        ' Abort on failure, returning an error code
        valRegError = Err.Number
        Err.Clear
        On Error Goto 0
        ReadRegValue = Array( myComputer, myRegPath, _
                              myRegPath, myRegValue, _
                              valRegError, "-", "-" )
        Exit Function
    Else
        ' Loop through all values in the list . . .
        For i = 0 To UBound( arrValueNames )
            ' . . . and find the one requested
            If UCase( arrValueNames( i ) ) = UCase( myRegValue ) Then
                ' Read the requested value's data type
                valRegType = arrValueTypes( i )
                ' Based on the data type, use the appropriate query to retrieve the data
                Select Case valRegType
                    Case REG_SZ
                        objReg.GetStringValue strHive, arrRegPath( 1 ), _
                                              myRegValue, valRegVal
                        If Err Then valRegError = Err.Number
                    Case REG_EXPAND_SZ
                        objReg.GetExpandedStringValue strHive, arrRegPath( 1 ), _
                                                      myRegValue, valRegVal
                        If Err Then valRegError = Err.Number
                    Case REG_BINARY ' returns an array of bytes
                        objReg.GetBinaryValue strHive, arrRegPath( 1 ), _
                                              myRegValue, valRegVal
                        If Err Then valRegError = Err.Number
                    Case REG_DWORD
                        objReg.GetDWORDValue strHive, arrRegPath( 1 ), _
                                             myRegValue, valRegVal
                        If Err Then valRegError = Err.Number
                    Case REG_MULTI_SZ ' returns an array of strings
                        objReg.GetMultiStringValue strHive, arrRegPath( 1 ), _
                                                   myRegValue, valRegVal
                        If Err Then valRegError = Err.Number
                    Case REG_QWORD
                        objReg.GetQWORDValue strHive, arrRegPath( 1 ), _
                                             myRegValue, valRegVal
                        If Err Then valRegError = Err.Number
                    Case Else
                        valRegError = 5
                End Select
            End If
        Next
    End If

    ' Check if an error occurred
    If valRegError > 0 Then
        valRegType = ""
        valRegVal  = ""
        Err.Clear
        On Error Goto 0
    End If

    ' Return the data in an array
    If valRegType = REG_BINARY Or valRegType = REG_MULTI_SZ Then
        ' First, deal with registry data which is
        ' returned as array instead of single value
        ReDim Preserve arrResult( 6 + UBound( valRegVal ) )
        arrResult( 0 ) = myComputer
        arrResult( 1 ) = strHive
        arrResult( 2 ) = arrRegPath( 1 )
        arrResult( 3 ) = myRegValue
        arrResult( 4 ) = valRegError
        arrResult( 5 ) = valRegType
        For i = 0 To UBound( valRegVal )
            arrResult( 6 + i ) = valRegVal( i )
        Next
        ReadRegValue = arrResult
    Else
        ReadRegValue = Array( myComputer, strHive, arrRegPath( 1 ), _
                              myRegValue, valRegError, valRegType, valRegVal )
    End If

    ' Finished
    Set objReg = Nothing
    On Error Goto 0
End Function
Requirements:
Windows version: ME, 2000, XP, Server 2003, or Vista (95, 98, NT 4 with WMI CORE 1.5)
Network: any
Client software: WMI CORE 1.5 for Windows 95, 98 or NT 4
Script Engine: any
Summarized: Can work on any Windows computer, but WMI CORE 1.5 is required for Windows 95, 98 or NT 4.
Can be used in *.vbs with CSCRIPT.EXE or WSCRIPT.EXE, as well as in HTAs.
 
[Back to the top of this page]

page last uploaded: 2016-09-19, 14:58