【问题标题】:Calling a method of a WMI Class调用 WMI 类的方法
【发布时间】:2015-06-09 22:53:44
【问题描述】:

我正在尝试调用以下方法:https://msdn.microsoft.com/en-us/library/dn469242(v=vs.85).aspx

对应的powershell为:

wmic /namespace:\\ROOT\Microsoft\Windows\DesiredStateConfiguration class MSFT_DSCLocalConfigurationManager call GetConfigurationStatus

我不太清楚如何使用 go-ole 正确执行此操作。这是我到目前为止所拥有的。它失败了:invoke_test.go:47: wmi: error calling method GetConfiguration: Exception occurred. Generic failure )

当我尝试使用GetConfigurationStatus 而不是GetConfiguration 时,我收到Unknown name 错误,所以我怀疑这个方法存在我只是调用它错误。

package wmi

import (
    "testing"

    "github.com/go-ole/go-ole"
    "github.com/go-ole/go-ole/oleutil"
)

func TestMethod(t *testing.T) {
    err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
    if err != nil {
        t.Fatal(err)
    }

    unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
    if err != nil {
        t.Fatal(err)
    }
    defer unknown.Release()

    wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
    if err != nil {
        t.Fatal(err)
    }
    defer wmi.Release()

    serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", nil, `ROOT\Microsoft\Windows\DesiredStateConfiguration`)
    if err != nil {
        t.Fatal(err)
    }
    service := serviceRaw.ToIDispatch()
    defer serviceRaw.Clear()

    typeName := "MSFT_DSCLocalConfigurationManager"
    typeRaw, err := oleutil.CallMethod(service, "Get", typeName)
    if err != nil {
        t.Fatalf("wmi: error fetching type %v: %v", typeName, err)
    }
    typeResult := typeRaw.ToIDispatch()
    defer typeRaw.Clear()

    methodName := "GetConfiguration"
    methodRaw, err := oleutil.CallMethod(typeResult, methodName)
    if err != nil {
        t.Fatalf("wmi: error calling method %v: %v", methodName, err)
    }
    item := methodRaw.ToIDispatch()
    defer methodRaw.Clear()
    _ = item
}

【问题讨论】:

  • 使用对象路径的 StartService/StopService 方法之类的简单方法可能更容易开始测试:\\.\root\cimv2:Win32_Service.Name="AudioSrv",您应该会看到系统托盘中的音量图标生效。您还可以查看使用来自msdn.microsoft.com/en-us/library/aa393862(v=vs.85).aspx 的 SWbemServices.ExecMethod

标签: go com wmi


【解决方案1】:

以管理员身份运行 wbemtest.exe,您可以打开 MSFT_DSCLocalConfigurationManager 类并使用 Show MOF 查看它的类定义:

[ClassVersion("1.0.0"), locale(1033), dynamic: ToInstance, provider("dsccore"): ToInstance]
class MSFT_DSCLocalConfigurationManager
{
    [implemented, static: DisableOverride ToSubClass] uint32 SendConfiguration([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[], [In] boolean force);
    [implemented, static: DisableOverride ToSubClass] uint32 SendConfigurationApply([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[], [In] boolean force);
    [implemented, static: DisableOverride ToSubClass] uint32 GetConfiguration([In, Octetstring: DisableOverride ToSubClass] uint8 configurationData[], [Stream: DisableOverride ToSubClass, EmbeddedInstance("OMI_BaseResource"): ToSubClass, Out] OMI_BaseResource configurations[]);
    [implemented, static: DisableOverride ToSubClass] uint32 TestConfiguration([In, Octetstring: DisableOverride ToSubClass] uint8 configurationData[], [Out] boolean InDesiredState, [Out, EmbeddedInstance("MSFT_ResourceInDesiredState"): ToSubClass] MSFT_ResourceInDesiredState ResourcesInDesiredState[], [Out, EmbeddedInstance("MSFT_ResourceNotInDesiredState"): ToSubClass] MSFT_ResourceNotInDesiredState ResourcesNotInDesiredState[]);
    [implemented, static: DisableOverride ToSubClass] uint32 ApplyConfiguration([In] boolean force);
    [implemented, static: DisableOverride ToSubClass] uint32 SendMetaConfigurationApply([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[]);
    [implemented, static: DisableOverride ToSubClass] uint32 GetMetaConfiguration([Out, EmbeddedInstance("MSFT_DSCMetaConfiguration"): ToSubClass] MSFT_DSCMetaConfiguration MetaConfiguration);
    [implemented, static: DisableOverride ToSubClass] uint32 RollBack([In] uint8 configurationNumber);
    [implemented, static: DisableOverride ToSubClass] uint32 PerformRequiredConfigurationChecks([In] uint32 Flags);
    [implemented, static: DisableOverride ToSubClass] uint32 StopConfiguration([In] boolean force);
    [implemented, static: DisableOverride ToSubClass] uint32 GetConfigurationStatus([In] uint32 Flags, [Stream: DisableOverride ToSubClass, EmbeddedInstance("MSFT_DSCConfigurationStatus"): ToSubClass, Out] MSFT_DSCConfigurationStatus configurationStatus[]);
    [implemented, static: DisableOverride ToSubClass] uint32 SendConfigurationApplyAsync([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[], [In] boolean force, [In] string jobId);
    [implemented, static: DisableOverride ToSubClass] uint32 GetConfigurationResultOutput([In] string jobId, [In, Octetstring: DisableOverride ToSubClass] uint8 resumeOutputBookmark[], [Out, Stream: DisableOverride ToSubClass, EmbeddedInstance("MSFT_DSCConfigurationOutput"): ToSubClass] MSFT_DSCConfigurationOutput output[]);
    [implemented, static: DisableOverride ToSubClass] uint32 RemoveConfiguration([In] uint32 Stage, [In] boolean Force);
    [implemented, static: DisableOverride ToSubClass] uint32 ResourceGet([In] string ResourceType, [In] string ModuleName, [In, Octetstring: DisableOverride ToSubClass] uint8 resourceProperty[], [Stream: DisableOverride ToSubClass, EmbeddedInstance("OMI_BaseResource"): ToSubClass, Out] OMI_BaseResource configurations[]);
    [implemented, static: DisableOverride ToSubClass] uint32 ResourceSet([In] string ResourceType, [In] string ModuleName, [In, Octetstring: DisableOverride ToSubClass] uint8 resourceProperty[], [Out] boolean RebootRequired);
    [implemented, static: DisableOverride ToSubClass] uint32 ResourceTest([In] string ResourceType, [In] string ModuleName, [In, Octetstring: DisableOverride ToSubClass] uint8 resourceProperty[], [Out] boolean InDesiredState);
};

GetConfiguration 是一种用于返回当前配置文档的方法,而不是最后一次 DSC 运行的状态。您可能使用的是旧版本的 DSC,请确保 $psversiontable 在 powershell 中至少显示 5.0.10018.0。

wbemtest.exe 还会让您使用 IWbemServices 执行方法(类似于您上面的代码)

它显示输出参数的类型:

[abstract]
class __PARAMETERS
{
    [Stream: DisableOverride ToSubClass, EmbeddedInstance("MSFT_DSCConfigurationStatus"): ToSubClass, Out, ID(1): DisableOverride ToInstance] MSFT_DSCConfigurationStatus configurationStatus[] = {
instance of MSFT_DSCConfigurationStatus
{
    DurationInSeconds = 33;
    HostName = "GBRAY02";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    相关资源
    最近更新 更多