Skip to content

Instantly share code, notes, and snippets.

@maddyblue
Created December 4, 2013 09:19
Show Gist options
  • Save maddyblue/7784658 to your computer and use it in GitHub Desktop.
Save maddyblue/7784658 to your computer and use it in GitHub Desktop.
package collectors
import (
"fmt"
ole "github.com/mattn/go-ole"
"github.com/mattn/go-ole/oleutil"
)
func wmiQuery(query string) ([]map[string]string, error) {
ole.CoInitialize(0)
defer ole.CoUninitialize()
unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
if err != nil {
return nil, err
}
defer unknown.Release()
wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
if err != nil {
return nil, err
}
defer wmi.Release()
// service is a SWbemServices
serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer")
if err != nil {
return nil, err
}
service := serviceRaw.ToIDispatch()
defer service.Release()
// result is a SWBemObjectSet
resultRaw, err := oleutil.CallMethod(service, "ExecQuery", query)
if err != nil {
return nil, err
}
result := resultRaw.ToIDispatch()
defer result.Release()
count, err := oleInt64(result, "Count")
if err != nil {
return nil, err
}
var results []map[string]string
for i := 0; i < count; i++ {
// item is a SWbemObject, but really a Win32_Process
itemRaw, err := oleutil.CallMethod(result, "ItemIndex", i)
if err != nil {
return nil, err
}
item := itemRaw.ToIDispatch()
defer item.Release()
props, err := oleutil.GetProperty(item, "Properties_")
if err != nil {
return nil, err
}
m := make(map[string]string)
results = append(results, m)
for _, p := range properties {
asString, err := oleutil.GetProperty(item, p)
if err != nil {
return nil, err
}
m[p] = asString.ToString()
}
}
return results, nil
}
func oleInt64(item *ole.IDispatch, prop string) (int64, error) {
v, err := oleutil.GetProperty(item, prop)
if err != nil {
return 0, err
}
i := int64(v.Val)
return i, nil
}
func oleProperties(object *ole.IDispatch) ([]OleProperty, error) {
// SWbemPropertySet
propsV, err := oleutil.GetProperty(object, "Properties_")
if err != nil {
return nil, err
}
props := propsV.ToIDispatch()
defer props.Release()
count, err := oleInt64(props, "Count)
if err != nil {
return nil, err
}
var r []string
for i := 0; i < count; i++ {
itemRaw, err := oleutil.CallMethod(props, "Item", i)
if err != nil {
return nil, err
}
item := itemRaw.ToIDispatch()
defer item.Release()
}
return r, nil
}
type OleProperty struct {
Name string
}
package collectors
import (
"fmt"
"testing"
)
func TestWmiQuery(t *testing.T) {
r, err := wmiQuery("SELECT Caption, CommittedBytes, AvailableBytes, PercentCommittedBytesInUse, PagesPerSec, PageFaultsPerSec FROM Win32_PerfFormattedData_PerfOS_Memory")
if err != nil {
t.Fatal(err)
}
for k, v := range r {
fmt.Println(k, v)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment