首頁 >後端開發 >Golang >如何使用 COM 從 Go 查詢 Windows Management Instrumentation (WMI)?

如何使用 COM 從 Go 查詢 Windows Management Instrumentation (WMI)?

Linda Hamilton
Linda Hamilton原創
2024-12-22 02:31:14944瀏覽

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