当前位置 博文首页 > WMI StdRegProv 通过wmi操作注册表的vbscript实现代码 (本地或远

    WMI StdRegProv 通过wmi操作注册表的vbscript实现代码 (本地或远

    作者:admin 时间:2021-02-09 18:24

    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. js