You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确定对应CLSID_WbemLocator的OLE对象名称以通过WMI获取KB?

如何确定WbemLocator对应的ProgID用于Go语言go-ole库的CreateObject?

CLSID_WbemLocator对应的ProgID是WbemScripting.SWbemLocator,你可以通过以下几种方式验证或获取这个值:

  • 查看Windows注册表:导航到HKEY_CLASSES_ROOT\CLSID\{76A64158-CB41-11D1-8B02-00600806D9B6},查看其中的ProgID项,其值即为WbemScripting.SWbemLocator。这个GUID是CLSID_WbemLocator的固定标识。
  • 使用命令行查询:在CMD中执行以下命令,直接获取ProgID:
    reg query HKCR\CLSID\{76A64158-CB41-11D1-8B02-00600806D9B6} /v ProgID
    
  • 参考WMI官方文档:SWbemLocator是WMI脚本对象模型中的标准定位器对象,官方文档明确其ProgID为WbemScripting.SWbemLocator。

在Go语言中使用go-ole库创建WbemLocator对象并查询Win32_QuickFixEngineering的示例代码如下:

package main

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

func main() {
    err := ole.CoInitialize(0)
    if err != nil {
        fmt.Println("CoInitialize failed:", err)
        return
    }
    defer ole.CoUninitialize()

    // 创建SWbemLocator对象
    unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
    if err != nil {
        fmt.Println("CreateObject failed:", err)
        return
    }
    defer unknown.Release()

    locator, err := unknown.QueryInterface(ole.IID_IDispatch)
    if err != nil {
        fmt.Println("QueryInterface failed:", err)
        return
    }
    defer locator.Release()

    // 连接到本地WMI命名空间root\cimv2
    service, err := oleutil.CallMethod(locator, "ConnectServer", ".", "root\\cimv2", "", "", "", "", 0, nil)
    if err != nil {
        fmt.Println("ConnectServer failed:", err)
        return
    }
    defer service.Release()

    // 执行Win32_QuickFixEngineering查询
    result, err := oleutil.CallMethod(service, "ExecQuery", "SELECT * FROM Win32_QuickFixEngineering")
    if err != nil {
        fmt.Println("ExecQuery failed:", err)
        return
    }
    defer result.Release()

    // 遍历查询结果
    enum, err := result.QueryInterface(ole.IID_IEnumVARIANT)
    if err != nil {
        fmt.Println("QueryInterface IEnumVARIANT failed:", err)
        return
    }
    defer enum.Release()

    var count uint32
    var variant ole.VARIANT
    for {
        err = enum.Next(1, &variant, &count)
        if err != nil || count == 0 {
            break
        }
        defer variant.Clear()

        kbItem := variant.ToIDispatch()
        defer kbItem.Release()

        // 获取KB编号
        kbNumber, err := oleutil.GetProperty(kbItem, "HotFixID")
        if err != nil {
            fmt.Println("Get HotFixID failed:", err)
            continue
        }
        defer kbNumber.Clear()
        fmt.Println("KB:", kbNumber.ToString())
    }
}

内容的提问来源于stack exchange,提问作者Shane Bishop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:34:56