Created
December 4, 2013 09:19
-
-
Save maddyblue/7784658 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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