tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShellでWMI-Objectの取得

PowerShellでは、Get-WmiObject Comandletを利用することで、従来のWSHなどに比べて簡単にWMI情報を取得できます。

また、.Netを読み込めばGet-WmiObjectを介さずにCommandletも取得可能です。 今回は、備忘録程度にGet-WmiObjectでの取得方法をいくつか載せておきます。 

シンプルな例

基本は、アクセスしたいWmiObjectを指定してプロパティを選びます。

#Select Property
$Basic = Get-WmiObject -Class win32_computersystem | select Name, Domain
$Basic

Get-WmiObject1

プロパティを加工して取得

上記よりも、ScriptBlockを介してプロパティを好きな形に加工して取得できた方が制御しやすく便利です。

# Get Install Information
$OperatingSystem = Get-WmiObject win32_operatingsystem
$OperatingSystem `
 | select @{Name = "Installed Date";Expression = {$_.ConvertToDateTime($_.InstallDate)}},
 Caption

Get-WmiObject2

上記は、ただ単にInstallDateプロパティを取得すると日付フォーマットが崩れるため、ConvertToDateTimeメソッドでDateTimeに変換しています。

Splattingでプロパティを指定して取得

Splattingを利用してプロパティを事前に指定しておいて任意に読み込む方法もあります。 ただ、この方法は人によっては見難い、見やすいと意見が分かれそうな気もしますが…… あと、SplattingとScriptBlockが共存し難いイメージでイマイチ好みではありません。

# Get Basic Information
$g=@{
    ClassName = "win32_computersystem";
    Property =
     "Name",
     "TotalPhysicalMemory",
     "Manufacturer",
     "Model"
    }
Get-WmiObject @g | select $g.Property

Get-WmiObject4

ScriptBlockを利用して任意のフォーマットへ出力結果を整形する

ScriptBlockを利用して、任意のフォーマット、式を指定もできます。

特に、-Fによる書式指定を利用すれば、ただプロパティを出力するのではなく、任意の書式を導くこともできます。 ScriptBlock大好き!!!

以下は、ごく単純な、ドライブ情報を取得する例です。 DriveTypeは、ドライブの種類です。

# Get Drive Inforamtion
$Drive=Get-WmiObject win32_volume
$Drive `
    | select DriveLetter,
        Label,
        DriveType,
        @{"label" = "Capacity"; "expression" = {"{0,7:0.00}GB" -F ($_.Capacity / 1GB)}},
        @{"label" = "FreeSpace"; "expression" = {"{0,7:0.00}GB" -F ($_.FreeSpace / 1GB)}},
        @{"label" = "Usage"; "expression" = {"{0,9:p}" -F ($_.FreeSpace / $_.Capacity)}},
        FileSystem,
        SystemVolume,
        BootVolume,
        AutoMount `
    | sort DriveLetter `
    | Format-Table -AutoSize

Get-WmiObject3  

WMI ReferenceによるLogicalDiskの解説はこちら: Win32_LogicalDisk class (Windows)

まとめ

いかがでしょうか? WSHに比べて、Comandletを利用することで圧倒的に楽にWMIへアクセスできることが分かります。

また、PowerShellはRemotePCへのアクセスも備えています。 (-ComputerName プロパティで指定可能) foreachと組み合わせれば、同時に複数のサーバー/PCへ順次リモート処理もできるわけで、管理者の手間が大幅に省けると言えます。

興味を持たれましたら、ぜひ皆さんもWmi-Objectを利用して楽をしましょう!!! (ぉ