调用 WMI 类的方法

huangapple go评论113阅读模式
英文:

Calling a method of a WMI Class

问题

我正在尝试调用以下方法: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 错误,所以我怀疑这个方法是存在的,只是我调用的方式不对。

  1. package wmi
  2. import (
  3. "testing"
  4. "github.com/go-ole/go-ole"
  5. "github.com/go-ole/go-ole/oleutil"
  6. )
  7. func TestMethod(t *testing.T) {
  8. err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
  9. if err != nil {
  10. t.Fatal(err)
  11. }
  12. unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
  13. if err != nil {
  14. t.Fatal(err)
  15. }
  16. defer unknown.Release()
  17. wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
  18. if err != nil {
  19. t.Fatal(err)
  20. }
  21. defer wmi.Release()
  22. serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", nil, `ROOT\Microsoft\Windows\DesiredStateConfiguration`)
  23. if err != nil {
  24. t.Fatal(err)
  25. }
  26. service := serviceRaw.ToIDispatch()
  27. defer serviceRaw.Clear()
  28. typeName := "MSFT_DSCLocalConfigurationManager"
  29. typeRaw, err := oleutil.CallMethod(service, "Get", typeName)
  30. if err != nil {
  31. t.Fatalf("wmi: error fetching type %v: %v", typeName, err)
  32. }
  33. typeResult := typeRaw.ToIDispatch()
  34. defer typeRaw.Clear()
  35. methodName := "GetConfiguration"
  36. methodRaw, err := oleutil.CallMethod(typeResult, methodName)
  37. if err != nil {
  38. t.Fatalf("wmi: error calling method %v: %v", methodName, err)
  39. }
  40. item := methodRaw.ToIDispatch()
  41. defer methodRaw.Clear()
  42. _ = item
  43. }

希望这可以帮到你!

英文:

I'm attempting to call the following method: https://msdn.microsoft.com/en-us/library/dn469242(v=vs.85).aspx

The corresponding powershell is:

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

I can't quite figure out how to do it correctly using go-ole. Here's what I have so far. It fails with: invoke_test.go:47: wmi: error calling method GetConfiguration: Exception occurred. Generic failure )

When I try using GetConfigurationStatus instead of GetConfiguration, I get a Unknown name error, so I suspect this method exists I'm just invoking it wrong.

  1. package wmi
  2. import (
  3. "testing"
  4. "github.com/go-ole/go-ole"
  5. "github.com/go-ole/go-ole/oleutil"
  6. )
  7. func TestMethod(t *testing.T) {
  8. err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
  9. if err != nil {
  10. t.Fatal(err)
  11. }
  12. unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
  13. if err != nil {
  14. t.Fatal(err)
  15. }
  16. defer unknown.Release()
  17. wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
  18. if err != nil {
  19. t.Fatal(err)
  20. }
  21. defer wmi.Release()
  22. serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", nil, `ROOT\Microsoft\Windows\DesiredStateConfiguration`)
  23. if err != nil {
  24. t.Fatal(err)
  25. }
  26. service := serviceRaw.ToIDispatch()
  27. defer serviceRaw.Clear()
  28. typeName := "MSFT_DSCLocalConfigurationManager"
  29. typeRaw, err := oleutil.CallMethod(service, "Get", typeName)
  30. if err != nil {
  31. t.Fatalf("wmi: error fetching type %v: %v", typeName, err)
  32. }
  33. typeResult := typeRaw.ToIDispatch()
  34. defer typeRaw.Clear()
  35. methodName := "GetConfiguration"
  36. methodRaw, err := oleutil.CallMethod(typeResult, methodName)
  37. if err != nil {
  38. t.Fatalf("wmi: error calling method %v: %v", methodName, err)
  39. }
  40. item := methodRaw.ToIDispatch()
  41. defer methodRaw.Clear()
  42. _ = item
  43. }

答案1

得分: 1

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

  1. [ClassVersion("1.0.0"), locale(1033), dynamic: ToInstance, provider("dsccore"): ToInstance]
  2. class MSFT_DSCLocalConfigurationManager
  3. {
  4. [implemented, static: DisableOverride ToSubClass] uint32 SendConfiguration([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[], [In] boolean force);
  5. [implemented, static: DisableOverride ToSubClass] uint32 SendConfigurationApply([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[], [In] boolean force);
  6. [implemented, static: DisableOverride ToSubClass] uint32 GetConfiguration([In, Octetstring: DisableOverride ToSubClass] uint8 configurationData[], [Stream: DisableOverride ToSubClass, EmbeddedInstance("OMI_BaseResource"): ToSubClass, Out] OMI_BaseResource configurations[]);
  7. [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[]);
  8. [implemented, static: DisableOverride ToSubClass] uint32 ApplyConfiguration([In] boolean force);
  9. [implemented, static: DisableOverride ToSubClass] uint32 SendMetaConfigurationApply([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[]);
  10. [implemented, static: DisableOverride ToSubClass] uint32 GetMetaConfiguration([Out, EmbeddedInstance("MSFT_DSCMetaConfiguration"): ToSubClass] MSFT_DSCMetaConfiguration MetaConfiguration);
  11. [implemented, static: DisableOverride ToSubClass] uint32 RollBack([In] uint8 configurationNumber);
  12. [implemented, static: DisableOverride ToSubClass] uint32 PerformRequiredConfigurationChecks([In] uint32 Flags);
  13. [implemented, static: DisableOverride ToSubClass] uint32 StopConfiguration([In] boolean force);
  14. [implemented, static: DisableOverride ToSubClass] uint32 GetConfigurationStatus([In] uint32 Flags, [Stream: DisableOverride ToSubClass, EmbeddedInstance("MSFT_DSCConfigurationStatus"): ToSubClass, Out] MSFT_DSCConfigurationStatus configurationStatus[]);
  15. [implemented, static: DisableOverride ToSubClass] uint32 SendConfigurationApplyAsync([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[], [In] boolean force, [In] string jobId);
  16. [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[]);
  17. [implemented, static: DisableOverride ToSubClass] uint32 RemoveConfiguration([In] uint32 Stage, [In] boolean Force);
  18. [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[]);
  19. [implemented, static: DisableOverride ToSubClass] uint32 ResourceSet([In] string ResourceType, [In] string ModuleName, [In, Octetstring: DisableOverride ToSubClass] uint8 resourceProperty[], [Out] boolean RebootRequired);
  20. [implemented, static: DisableOverride ToSubClass] uint32 ResourceTest([In] string ResourceType, [In] string ModuleName, [In, Octetstring: DisableOverride ToSubClass] uint8 resourceProperty[], [Out] boolean InDesiredState);
  21. };

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

wbemtest.exe还可以让您使用IWbemServices来执行一个方法(类似于您上面的代码)。

调用 WMI 类的方法

它显示输出参数的类型为:

  1. [abstract]
  2. class __PARAMETERS
  3. {
  4. [Stream: DisableOverride ToSubClass, EmbeddedInstance("MSFT_DSCConfigurationStatus"): ToSubClass, Out, ID(1): DisableOverride ToInstance] MSFT_DSCConfigurationStatus configurationStatus[] = {
  5. instance of MSFT_DSCConfigurationStatus
  6. {
  7. DurationInSeconds = 33;
  8. HostName = "GBRAY02";
  9. }
  10. }
英文:

Running wbemtest.exe as an administrator you can open the MSFT_DSCLocalConfigurationManager class and use Show MOF to see it's class definition:

  1. [ClassVersion("1.0.0"), locale(1033), dynamic: ToInstance, provider("dsccore"): ToInstance]
  2. class MSFT_DSCLocalConfigurationManager
  3. {
  4. [implemented, static: DisableOverride ToSubClass] uint32 SendConfiguration([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[], [In] boolean force);
  5. [implemented, static: DisableOverride ToSubClass] uint32 SendConfigurationApply([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[], [In] boolean force);
  6. [implemented, static: DisableOverride ToSubClass] uint32 GetConfiguration([In, Octetstring: DisableOverride ToSubClass] uint8 configurationData[], [Stream: DisableOverride ToSubClass, EmbeddedInstance("OMI_BaseResource"): ToSubClass, Out] OMI_BaseResource configurations[]);
  7. [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[]);
  8. [implemented, static: DisableOverride ToSubClass] uint32 ApplyConfiguration([In] boolean force);
  9. [implemented, static: DisableOverride ToSubClass] uint32 SendMetaConfigurationApply([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[]);
  10. [implemented, static: DisableOverride ToSubClass] uint32 GetMetaConfiguration([Out, EmbeddedInstance("MSFT_DSCMetaConfiguration"): ToSubClass] MSFT_DSCMetaConfiguration MetaConfiguration);
  11. [implemented, static: DisableOverride ToSubClass] uint32 RollBack([In] uint8 configurationNumber);
  12. [implemented, static: DisableOverride ToSubClass] uint32 PerformRequiredConfigurationChecks([In] uint32 Flags);
  13. [implemented, static: DisableOverride ToSubClass] uint32 StopConfiguration([In] boolean force);
  14. [implemented, static: DisableOverride ToSubClass] uint32 GetConfigurationStatus([In] uint32 Flags, [Stream: DisableOverride ToSubClass, EmbeddedInstance("MSFT_DSCConfigurationStatus"): ToSubClass, Out] MSFT_DSCConfigurationStatus configurationStatus[]);
  15. [implemented, static: DisableOverride ToSubClass] uint32 SendConfigurationApplyAsync([In, Octetstring: DisableOverride ToSubClass] uint8 ConfigurationData[], [In] boolean force, [In] string jobId);
  16. [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[]);
  17. [implemented, static: DisableOverride ToSubClass] uint32 RemoveConfiguration([In] uint32 Stage, [In] boolean Force);
  18. [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[]);
  19. [implemented, static: DisableOverride ToSubClass] uint32 ResourceSet([In] string ResourceType, [In] string ModuleName, [In, Octetstring: DisableOverride ToSubClass] uint8 resourceProperty[], [Out] boolean RebootRequired);
  20. [implemented, static: DisableOverride ToSubClass] uint32 ResourceTest([In] string ResourceType, [In] string ModuleName, [In, Octetstring: DisableOverride ToSubClass] uint8 resourceProperty[], [Out] boolean InDesiredState);
  21. };

GetConfiguration is a method used to return the current configuration document, not the status of the last DSC run. You may be using an older version of DSC, make sure $psversiontable in powershell shows at least 5.0.10018.0.

wbemtest.exe will also let you use IWbemServices to execute a method (similar to the code you have above)

调用 WMI 类的方法

and it shows the output parameters are of type:

  1. [abstract]
  2. class __PARAMETERS
  3. {
  4. [Stream: DisableOverride ToSubClass, EmbeddedInstance("MSFT_DSCConfigurationStatus"): ToSubClass, Out, ID(1): DisableOverride ToInstance] MSFT_DSCConfigurationStatus configurationStatus[] = {
  5. instance of MSFT_DSCConfigurationStatus
  6. {
  7. DurationInSeconds = 33;
  8. HostName = "GBRAY02";

huangapple
  • 本文由 发表于 2015年6月10日 06:53:44
  • 转载请务必保留本文链接:https://go.coder-hub.com/30744205.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定