Golang中的远程WMI调用中断“;随机地;

Golang中的远程WMI调用中断“;随机地;,go,wmi,Go,Wmi,我必须从我们的Golang工具进行一些远程WMI查询 目前,我使用该包进行WMI调用。这反过来又基于的OLE调用 基本上,这种方法工作得很好,性能也很高。我们每小时打几百个电话 例如,我们的代码如下所示: package main import ( "log" "github.com/StackExchange/wmi" ) type Win32_PerfRawData_PerfOS_Processor struct { PercentProcessorTime ui

我必须从我们的Golang工具进行一些远程WMI查询

目前,我使用该包进行WMI调用。这反过来又基于的OLE调用

基本上,这种方法工作得很好,性能也很高。我们每小时打几百个电话

例如,我们的代码如下所示:

package main

import (
    "log"
    "github.com/StackExchange/wmi"
)

type Win32_PerfRawData_PerfOS_Processor struct {
    PercentProcessorTime uint64
    TimeStamp_Sys100NS   uint64
}

func main() {

    var rawOS []Win32_PerfRawData_PerfOS_Processor
    err := wmi.Query("SELECT * FROM Win32_PerfRawData_PerfOS_Processor where name='_Total'", &rawOS, "remotehost")
    if err != nil {
        log.Fatal(err)
    }

    // here comes stuff to work with rawOS... 

}
不幸的是,有时会发生一些完全错误的事情。我们的Golang工具完全崩溃,我们遇到了一个异常:

Exception 0xc0000005 0x0 0xffffffffffffffff 0x7ffadcc72503
PC=0x7ffadcc72503
signal arrived during external code execution
syscall.Syscall(0x7ffad9f0c0a0, 0x1, 0xc0019dbce0, 0x0, 0x0, 0x0, 0x0, 0x0)
        c:/go/src/runtime/**syscall_windows.go:188** +0xfa
golang.org/x/sys/windows.(*Proc).Call(0xc00066e760, 0xc000adc448, 0x1, 0x1, 0x8, 0x9273a0, 0xa63c01, 0xc000adc448)
        C:/goworkspace/src/golang.org/x/sys/windows/dll_windows.go:139 +0x136
golang.org/x/sys/windows.(*LazyProc).Call(0xc00026d080, 0xc000adc448, 0x1, 0x1, 0x0, 0xc001e93980, 0x4317b8, 0x9eb018)
        C:/goworkspace/src/golang.org/x/sys/windows/dll_windows.go:317 +0x66
github.com/go-ole/go-ole.VariantClear(0xc0019dbce0, 0xc001e93bc8, 0xc001e93990)
        C:/goworkspace/src/github.com/go-ole/go-ole/com.go:248 +0x6c
github.com/go-ole/go-ole.(*VARIANT).Clear(0xc0019dbce0, 0x0, 0x0)
        C:/goworkspace/src/github.com/go-ole/go-ole/variant.go:47 +0x32
main.(*Client).Query(0xdc5ed0, 0x9dd17d, 0x30, 0x90b540, 0xc0012d7760, 0xc0012d7780, 0x2, 0x2, 0x0, 0x0)
        C:/goworkspace/src/github.com/StackExchange/wmi/wmi.go:211 +0x939
main.Query(0x9dd17d, 0x30, 0x90b540, 0xc0012d7760, 0xc0012d7780, 0x2, 0x2, 0x0, 0x0)
        C:/goworkspace/src/github.com/StackExchange/wmi/wmi.go:52 +0x10c
main.GetWMIProcess(0xc00004d180, 0xc000273380, 0xc022e21590, 0x11ae7b33b1a684)
        C:/goworkspace/src/xxx/1.go:69 +0x234
main.(*Server).startupServer.func10(0xc00004d180, 0xc000273380)
        C:/goworkspace/src/xxx/2.go:216 +0x3c
main.taskloop(0xc000273380)
        C:/goworkspace/src/xxx/3.go:60 +0x206
created by main.(*ServerTask).Start
        C:/goworkspace/src/xxx/3.go:30 +0xbb
我们经常在各种WMI查询中遇到此异常。其背后的模式是,它通常发生在夜间,远程服务器处理大量批处理或备份等,但它也发生在白天

由于我们尚未找到捕获异常的方法,我的问题是:

我们做错了什么?查询直接中断。这个错误不是由它引起的。最后是我们经常看到的最后一件事:syscall_windows。go:188

当然,我们还测试了如果无法访问远程服务器会发生什么情况。这很容易处理:“2020/03/20 10:53:53发生异常。(RPC服务器不可用)。”

因此,我们的问题是:

  • 是否有人使用上述软件包进行远程WMI查询?有什么意见或建议吗?最佳实践
  • 我们基本上是在代码中做错了什么吗?而且,为什么它大部分时间都有效
  • 在Golang中是否有人有其他远程WMI调用方法
任何帮助都将不胜感激