首页 >后端开发 >Golang >如何使用 COM 从 Go 查询 Windows Management Instrumentation (WMI)?

如何使用 COM 从 Go 查询 Windows Management Instrumentation (WMI)?

Linda Hamilton
Linda Hamilton原创
2024-12-22 02:31:14898浏览

How Can I Query Windows Management Instrumentation (WMI) from Go Using COM?

使用 COM 从 Go 查询 WMI

在 Windows 管理领域,查询 Windows Management Instrumentation (WMI) 是一项至关重要的任务。对于那些寻求在 Go 中实现此目的的方法的人来说,以下解决方案提供了一种利用 COM 的简单方法。

Mattn,GitHub 上的贡献者,创建了一个方便的包装器来简化该过程。使用此包装器以及必要的错误处理,下面是一个示例程序:

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

func main() {
    // Initialize and later uninitialize COM
    ole.CoInitialize(0)
    defer ole.CoUninitialize()

    // Create WbemScripting.SWbemLocator object
    unknown, _ := oleutil.CreateObject("WbemScripting.SWbemLocator")
    defer unknown.Release()

    // Obtain SWbemServices object
    wmi, _ := unknown.QueryInterface(ole.IID_IDispatch)
    defer wmi.Release()
    serviceRaw, _ := oleutil.CallMethod(wmi, "ConnectServer")
    service := serviceRaw.ToIDispatch()
    defer service.Release()

    // Execute WMI query
    resultRaw, _ := oleutil.CallMethod(service, "ExecQuery", "SELECT * FROM Win32_Process")
    result := resultRaw.ToIDispatch()
    defer result.Release()

    // Gather process names
    countVar, _ := oleutil.GetProperty(result, "Count")
    count := int(countVar.Val)
    for i := 0; i < count; i++ {
        itemRaw, _ := oleutil.CallMethod(result, "ItemIndex", i)
        item := itemRaw.ToIDispatch()
        defer item.Release()
        asString, _ := oleutil.GetProperty(item, "Name")
        println(asString.ToString())
    }
}

在此代码中,关键操作是调用 ExecQuery,它检索所需的 WMI 数据。例如,我们检索正在运行的进程的名称。运行该程序应该会在您的系统上生成一个活动进程列表。

该解决方案利用了 COM 的强大功能,这是 C 语言面向对象编程早期的遗留技术。虽然它可能不是最强大的现代方法,它提供了一种稳定可靠的方式与 Go 中的 WMI 交互。

以上是如何使用 COM 从 Go 查询 Windows Management Instrumentation (WMI)?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn