我正在使用 mattn 的 go-ole 包连接到 WMI,我使用在堆栈中找到的一些示例使它工作,并且一切正常,直到我尝试使其在 Win XP 中工作。 Microsoft 文档说 thatWbemScripting.SWbemLocator
仅适用于 Vista,因此我一直在尝试 Microsoft 展示的用于 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")
如有任何帮助,我们将不胜感激。
最佳答案
偶然发现了这个问题,想提供一个答案。
要连接到命名空间/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
}
关于Golang WMI查询XP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47961176/