Vbscript 在vb脚本中写入DWORD注册表项不起作用

Vbscript 在vb脚本中写入DWORD注册表项不起作用,vbscript,scripting,registry,Vbscript,Scripting,Registry,我使用下面的函数从32位脚本主机读写64位注册表 它可以很好地读写字符串,但当我尝试使用DWORD时,它失败了 这是一个字符串 strResult = WriteRegStr (Write_REG_SZ, HKEY_LOCAL_MACHINE, "Software\_TEST", "SubKey1", "1", 64) 但不是作为DWORD,错误是VBScript运行时错误:对象不支持此属性或方法:“oInParams.sValue” 谢谢你的帮助 '---------------------

我使用下面的函数从32位脚本主机读写64位注册表

它可以很好地读写字符串,但当我尝试使用DWORD时,它失败了

这是一个字符串

strResult = WriteRegStr (Write_REG_SZ, HKEY_LOCAL_MACHINE, "Software\_TEST", "SubKey1", "1", 64)
但不是作为DWORD,错误是VBScript运行时错误:对象不支持此属性或方法:“oInParams.sValue”

谢谢你的帮助

'---------------------------------------------------
' Declared Constants 
'---------------------------------------------------

Const wbemFlagReturnImmediately = &h10 
Const wbemFlagForwardOnly = &h20
Const HKEY_LOCAL_MACHINE = &H80000002
Const Read_REG_SZ = "GetStringValue"
Const Write_REG_SZ = "SetStringValue"
Const Read_REG_DWORD = "GetDWORDValue"
Const Write_REG_DWORD = "SetDWORDValue"
Const Success = 0
Const Failure = 1

'---------------------------------------------------
' Function Read Registry String
'---------------------------------------------------

Function ReadRegStr (Method, RootKey, Key, Value, RegType) 
    Dim oCtx, oLocator, oReg, oInParams, oOutParams 

    Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet") 
    oCtx.Add "__ProviderArchitecture", RegType 

    Set oLocator = CreateObject("Wbemscripting.SWbemLocator") 
    Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv") 

    Set oInParams = oReg.Methods_(Method).InParameters 
    oInParams.hDefKey = RootKey 
    oInParams.sSubKeyName = Key 
    oInParams.sValueName = Value 

    Set oOutParams = oReg.ExecMethod_(Method, oInParams, , oCtx) 

    Select Case Method
      Case "GetDWORDValue"  : ReadRegStr = oOutParams.uValue
      Case "GetStringValue" : ReadRegStr = oOutParams.sValue
    End Select


    'ReadRegStr = oOutParams.sValue 

    set oCtx = Nothing 
    set oLocator = Nothing 
End Function

'---------------------------------------------------
' Function Write Registry String
'---------------------------------------------------

Function WriteRegStr (Method, RootKey, Key, ValueName, Value, RegType) 

    Dim oCtx, oLocator, oReg, oInParams, oOutParams 

    Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet") 
    oCtx.Add "__ProviderArchitecture", RegType 

    Set oLocator = CreateObject("Wbemscripting.SWbemLocator") 
    Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv") 

    Set oInParams = oReg.Methods_(Method).InParameters 
    oInParams.hDefKey = RootKey 
    oInParams.sSubKeyName = Key 
    oInParams.sValueName = ValueName 
    oInParams.sValue = Value 

    Set oOutParams = oReg.ExecMethod_(Method, oInParams, , oCtx) 

    WriteRegStr = oOutParams.ReturnValue

    Set oCtx = Nothing 
    Set oLocator = Nothing 

End Function

这是因为DWORD值的属性是
uValue
,而不是
sValue

您可以使用
Select Case
语句来处理该问题:

Select Case Method
  Case "SetDWORDValue"  : oInParams.uValue = Value
  Case "SetStringValue" : oInParams.sValue = Value
End Select
请注意,在处理
ReadRegStr
函数中的
oOutParam
返回的数据时,需要使用相同的方法


但坦率地说,在我看来,这种为注册表访问构建抽象的尝试是错误的,我建议坚持使用常规的WMI方法。只有当您不需要知道要读取或写入的值的类型时,抽象才有帮助。

谢谢,我的写入函数正在工作,读取函数仍然存在问题,这看起来可以吗?我在第一篇文章中更新了这个函数。@user2130499你是说对
ReadRegStr
函数的修改?是的,那应该可以用。为了安全起见,您可以在
选择案例
中添加一个
Case Else
,以处理
方法
不是定义字符串之一的情况。谢谢,只需再次检查它,它似乎正在工作:)谢谢您的帮助
Select Case Method
  Case "SetDWORDValue"  : oInParams.uValue = Value
  Case "SetStringValue" : oInParams.sValue = Value
End Select