Golang WMI查询XP

标签 go wmi ole

我正在使用 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/

相关文章:

go - 字符串迭代编程

json - 如何在 golang 中解析 JSON?

go - 使用方法而不是闭包更好吗?

.net - 在.NET Windows窗体上从Chrome实现拖放

c++ - 使用 C++ Builder 5 实现 Word 自动化

database - DDD 设计模式建议中的交易

c# - Microsoft.Management.Infrastructure 命名空间 - Cim 类

powershell - 将 Win32_OperatingSystem 的 CountryCode 转换为国家字符串

c# - 通过 WMI 查询对远程计算机上 UNC 路径的访问

java - OleControl 中的错误导致 JVM 完全崩溃 - 如何抑制?