如何确定对应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
相关产品推荐
相关产品推荐

