#はじめに
以前、PythonからリモートPCの色んな情報を抜いてみた by WMI Libraryというエントリーを投稿しましたが、今度はGo言語でリモートPCの情報を抜いてみたいと思います。
尚、Goの開発環境と実行環境は、既に準備できていることを前提に書いています。
また、WMIのモジュールはこちらで公開しているものを使わせて頂きました。
(サポートするプラットフォームはWindowsだけのようです)
#WMI for Go のインストール
goコマンドで一撃インストールです。
>go get -v github.com/StackExchange/wmi
#まずはExample的なモノを動かす
github.com/StackExchange/wmi.go の冒頭コメントにExample的なものが記載されていたので、取敢えずはそれに倣ってテストコードを書いて動かしてみます。
テストコードは以下のような感じです。(ほぼExampleの丸写し)
package main
import (
. "fmt"
"github.com/StackExchange/wmi"
"log"
)
type Win32_Process struct {
Name string
}
func main() {
var dst []Win32_Process
q := wmi.CreateQuery(&dst, "")
err := wmi.Query(q, &dst)
if err != nil {
log.Fatal(err)
}
for i, v := range dst {
Println(i, v.Name)
}
}
テストコードができたので、とりあえず動かしてみます。
ちなみにコードを実行すると、以下のようにローカルPC上の実行プロセス一覧が表示されます。
>go run wmitest.go
0 System Idle Process
1 System
2 smss.exe
3 csrss.exe
4 wininit.exe
5 services.exe
6 lsass.exe
7 svchost.exe
8 svchost.exe
9 fontdrvhost.exe
10 svchost.exe
...(省略)
205 notepad.exe
206 chrome.exe
207 WmiPrvSE.exe
208 WmiPrvSE.exe
209 SearchProtocolHost.exe
210 smartscreen.exe
211 cmd.exe
212 conhost.exe
213 go.exe
214 wmitest.exe
環境やモジュール依存周りでハマるかもしれない、と覚悟していたのですが、あまりに呆気なく動いたので少々拍子抜けです。
尚、Win32_ProcessクラスのNameプロパティから値を取得していることが解ります。
#リモートマシンの情報を抜いてみる
次に、実際に欲しい情報はローカルPCの実行プロセス一覧ではないので、リモートPCのOS情報を取得できるコードに改変します。(テストコードをコピー&改変)
package main
import (
. "fmt"
"github.com/StackExchange/wmi"
"log"
)
var NODE string = "hostname.mydomain.local"
var USER string = "MYDOMAIN\\Administrator"
var PASS string = "P@sswr0d"
type Win32_OperatingSystem struct {
CSName string
Caption string
Version string
CSDVersion string
}
func main() {
var dst []Win32_OperatingSystem
q := wmi.CreateQuery(&dst, "")
err := wmi.Query(q, &dst, NODE, nil, USER, PASS)
if err != nil {
log.Fatal(err)
}
for _, v := range dst {
Printf("CSName: %s\n", v.CSName)
Printf("Caption: %s\n", v.Caption)
Printf("Version: %s\n", v.Version)
Printf("CSDVersion: %s\n", v.CSDVersion)
}
}
テストコードはWin32_Processクラスを参照していたので、Win32_OperatingSystemクラスを参照するよう変更しました。
ちなみに、リモートマシンへ接続するには、wmi.Query()
のパラメータに、コードのように認証情報(ホスト名 | IPアドレス、アカウント、パスワード)をセットする必要があります。
またパラメータの4番目は WMI の namespace を指定することができ、何も渡さなければデフォルトの namespace (root\CIMV2)が参照されます。
(参考)WMI for Goドキュメント
コードを実行すると、以下のようにリモートマシンのOS情報が表示されます。
>go run sysinfo.go
CSName: hostname.mydomain.local
Caption: Microsoft Windows 7 Professional
Version: 6.1.7601
CSDVersion: Service Pack 1