PowerShellでシステムの情報を参照する

PowerShellでインフラ系のスクリプトを作っていると、システムの情報を参照したいときがあります。
Windowsならsysteminfoコマンドで表示させることができますが、これをPowerShellで取得してみます。といってもWMIオブジェクトを呼んでいるだけなので、C#など他のWindowsネイティブな言語でも同様にできるはず。

もくじ:

PowerShellによるコンピュータ情報の取得

まずはサンプル全体を掲載しておきます。
get_systeminfo関数はWMIオブジェクトのプロパティ値を整形し、JSON文字列を返します。本来はクラスの細かい操作などあるのですが、動けばよしということで。

実行結果はこんな感じです。

解説

上に掲載したスクリプトのポイントを簡単に記載しておきます。出力するオジェクトはテキトーに定義しているだけなので、必要に応じて適切な部分のみを使うやり方もありですね。

システム

ここではWin32_ComputerSystemオブジェクトを呼んでいます。
プロパティ名から何の情報か予想できますが、systeminfoコマンド出力値と対応しているものがいくつかありますね。

ちょっとわかりにくいところを挙げると、プロパティの.Nameがいわゆるホスト名を表すところや、物理メモリ.TotalPhysicalMemoryがバイト数で返されるところですかね。

プロセッサ

CPUの情報を格納しているWin32_Processorオブジェクト。
パソコンのときはともかく、複数ソケットがサポートされているようなサーバマシンでは配列が返ってくるようです。

他にも製造元(.Manufacturer, この場合はIntel)とか、チップセット形状(.SocketDesignation, LGA何ちゃら)も取れるようになっています。

BIOS

BIOSの情報を格納しているWin32_BIOSオブジェクト。

.ReleaseDateプロパティにはBIOSのリリース日(インストールされた日ではありません)が格納されていますので、DateTimeオブジェクトとしてパースすることもできます。ここでは年月日に区切りを入れているだけなので、ちょっとやりすぎなのですが。
systeminfoコマンド出力値に「BIOSバージョン」の項目がありますが、どうやら単純なバージョン番号のみではないようですね。

OS

OS、というか稼働しているWindowsの情報を格納しているWin32_OperatingSystemオブジェクト。

特にわかりにくいところはないと思います。.InstallDateは字面ではOSがインストールされた日ですが、適用している場合は直近の大型アップデートがインストールされた日になります。
また、.SerialNumberでプロダクトIDが取得できます。

ネットワーク(NIC)

ネットワーク情報は、アダプタ(デバイス)を表すWin32_NetworkAdapterと、アダプタに適用されている設定を表すWin32_NetworkAdapterConfigurationに分かれています。

Win32_NetworkAdapter.NetConnectionStatusを調べると利用可能かどうかが分かります。MACアドレスやIPアドレスを調べるときには不要な、WAN miniportなどいわゆる仮想アダプタはこの値を持っていない($null)ので、これを調べることでフィルタすることができます。