我对Win32_WindowsProductActivation
WMI类和SetProductKey
方法有疑问。
当我运行使用WMi Code创建者生成的此代码(vbscript)时,执行失败并显示错误Invalid parameter
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
' Obtain an instance of the the class
' using a key property value.
Set objShare = objWMIService.Get("Win32_WindowsProductActivation")
' Obtain an InParameters object specific
' to the method.
Set objInParam = objShare.Methods_("SetProductKey"). _
inParameters.SpawnInstance_()
' Add the input parameters.
objInParam.Properties_.Item("ProductKey") = "QW4HDDQCRGHM64M6GJRK8K83T"
' Execute the method and obtain the return status.
' The OutParameters object in objOutParams
' is created by the provider.
Set objOutParams = objWMIService.ExecMethod("Win32_WindowsProductActivation", "SetProductKey", objInParam)
' List OutParams
Wscript.Echo "Out Parameters: "
Wscript.echo "ReturnValue: " & objOutParams.ReturnValue
但如果我使用此代码,则可以使用InstancesOf
方法。
Dim VOL_PROD_KEY
VOL_PROD_KEY = "QW4HDDQCRGHM64M6GJRK8K83T"
for each Obj in GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf ("win32_WindowsProductActivation")
result = Obj.SetProductKey (VOL_PROD_KEY)
if err <> 0 then
WScript.Echo Err.Description, "0x" & Hex(Err.Number)
Err.Clear
end if
Next
静止是
为什么第一个代码失败了?或者为什么这个wmi类需要使用InstancesOf
?
答案 0 :(得分:1)
您必须直接调用并直接传递SetProductKey
方法的参数,而不使用SpawnInstance_
,因为此方法非静态。
规则是,如果执行的wmi方法是静态的,你可以使用SpawnInstance_
否则调用直接传递参数的方法
这里有静态和非静态方法的描述。
静态方法仅适用于WMI 类而不是特定的实例 一堂课。例如,创建 Win32_Process类的方法是一个 静态方法因为用它来创建 没有实例的新流程 这个班。非静态方法适用 只对一个类的实例。对于 例如,Terminate方法 Win32_Process类是非静态的 方法因为它才有意义 如果是实例,则终止进程 那个过程存在。你可以确定 如果方法是静态的,通过检查是否 静态限定符是关联的 用这个方法。
此外,您可以查看此文章Calling a Provider Method