LoginSignup
4
8

More than 5 years have passed since last update.

WMI経由でリモートPCの情報を抜いてみた by Go言語

Last updated at Posted at 2017-06-16

はじめに

以前、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の丸写し)

wmitest.go
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情報を取得できるコードに改変します。(テストコードをコピー&改変)

sysinfo.go
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
4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8