Golang WMI查询XP

时间:2017-12-24 13:55:57

标签: go wmi ole

我使用mattn的go-ole软件包连接到WMI,我使用了一些我在堆栈上找到的例子,这一切都很好,直到我试图让它在Win XP中运行。 Microsoft文档说thatWbemScripting.SWbemLocator仅适用于Vista,所以我一直在尝试微软在VBScript上使用的winmgmts方法,但我没有到达任何地方。

这就是我所拥有的。

这适用于Win 7:

wmiscriptObj, err := oleutil.CreateObject("WbemScripting.SWbemLocator")

这在XP或7中都不起作用:

wmiscriptObj, err := oleutil.CreateObject("winmgmts:\\\\.\\root\\cimv2")

我将无效的课程视为错误。

不确定这是否有助于解释事情,但过去我使用Autoit在XP上查询WMI,我可以连接到:

$objWMIService = ObjGet("winmgmts:\\" & $ComputerName & "\root\CIMV2")

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

偶然发现了这个问题,想提供答案。

要连接到名称空间/ winmgmts,您需要使用记录不完整的名称空间参数执行Connect-方法。

示例代码     包主

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

func main() {
    ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
    defer ole.CoUninitialize()

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

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

    // Connect to namespace
    // root/PanasonicPC = winmgmts:\\.\root\PanasonicPC
    serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", nil, "root/PanasonicPC")
    if err != nil {
        log.Panic(err)
    }
    service := serviceRaw.ToIDispatch()
    defer serviceRaw.Clear()

    // Interact with service object etc
}