我使用mattn的go-ole软件包连接到WMI,我使用了一些我在堆栈上找到的例子,这一切都很好,直到我试图让它在Win XP中运行。 Microsoft文档说thatWbemScripting.SWbemLocator
仅适用于Vista,所以我一直在尝试微软在VBScript上使用的winmgmts
方法,但我没有到达任何地方。
这就是我所拥有的。
这适用于Win 7:
wmiscriptObj, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
这在XP或7中都不起作用:
wmiscriptObj, err := oleutil.CreateObject("winmgmts:\\\\.\\root\\cimv2")
我将无效的课程视为错误。
不确定这是否有助于解释事情,但过去我使用Autoit在XP上查询WMI,我可以连接到:
$objWMIService = ObjGet("winmgmts:\\" & $ComputerName & "\root\CIMV2")
非常感谢任何帮助。
答案 0 :(得分:0)
偶然发现了这个问题,想提供答案。
要连接到名称空间/ winmgmts,您需要使用记录不完整的名称空间参数执行Connect-方法。
示例代码 包主
import (
"github.com/go-ole/go-ole"
"github.com/go-ole/go-ole/oleutil"
)
func main() {
ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
defer ole.CoUninitialize()
unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
if err != nil {
log.Panic(err)
}
defer unknown.Release()
wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
if err != nil {
log.Panic(err)
}
defer wmi.Release()
// Connect to namespace
// root/PanasonicPC = winmgmts:\\.\root\PanasonicPC
serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", nil, "root/PanasonicPC")
if err != nil {
log.Panic(err)
}
service := serviceRaw.ToIDispatch()
defer serviceRaw.Clear()
// Interact with service object etc
}