使用 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中文网其他相关文章!