tech.guitarrapc.cóm

Technical updates

PowerShellのWMI Objectのinheritance(継承)を参照するには

興味深く有意義な記事があったので確認しました。

Displaying WMI Inheritance

PowerShell 3.0からは、PSTypeNamesというGet-Memberでは表示されない隠れたプロパティが存在します。 このPSTypeNamesを利用することで、WMIオブジェクトの継承ツリーが確認出来るようになりました。

これにより、継承元のWMIクラスを利用することでWMI queryを拡げる事無く継承元を利用するなどして要素を取得できます。

サンプル

たとえば、Win32_OperatingSystemを考えます。

$os = Get-WmiObject -Class Win32_OperatingSystem
$os.pstypenames

すると、Win32_OperatingSystemが継承しているInheritance Treeが表示されます。

System.Management.ManagementObject#root\cimv2\Win32_OperatingSystem
System.Management.ManagementObject#root\cimv2\CIM_OperatingSystem
System.Management.ManagementObject#root\cimv2\CIM_LogicalElement
System.Management.ManagementObject#root\cimv2\CIM_ManagedSystemElement
System.Management.ManagementObject#Win32_OperatingSystem
System.Management.ManagementObject#CIM_OperatingSystem
System.Management.ManagementObject#CIM_LogicalElement
System.Management.ManagementObject#CIM_ManagedSystemElement
System.Management.ManagementObject
System.Management.ManagementBaseObject
System.ComponentModel.Component
System.MarshalByRefObject
System.Object

ここで、3つのWmi Objectをたたくと、CIM_LogicalElementCIM_ManagedSystemElementが継承元と分かります。

Get-WmiObject -Class Win32_OperatingSystem #今回の継承元
Get-WmiObject -Class CIM_OperatingSystem #継承元と同じ結果
Get-WmiObject -Class CIM_ManagedSystemElement #継承元
Get-WmiObject -Class CIM_LogicalElement #継承元

試しにCaption, __Classだけで出力してみるも14681KBを超えました。

Get-WmiObject -Class CIM_LogicalElement | Select-Object -Property Caption, __Class

他のWMIObjectはどうなの?

例えば、Win32_biosです。

$bios = Get-WmiObject -Class Win32_bios
$bios.pstypenames

この通り、やはりCIM_LogicalElementCIM_ManagedSystemElementが継承元と分かります。

System.Management.ManagementObject#root\cimv2\Win32_BIOS
System.Management.ManagementObject#root\cimv2\CIM_BIOSElement
System.Management.ManagementObject#root\cimv2\CIM_SoftwareElement
System.Management.ManagementObject#root\cimv2\CIM_LogicalElement
System.Management.ManagementObject#root\cimv2\CIM_ManagedSystemElement
System.Management.ManagementObject#Win32_BIOS
System.Management.ManagementObject#CIM_BIOSElement
System.Management.ManagementObject#CIM_SoftwareElement
System.Management.ManagementObject#CIM_LogicalElement
System.Management.ManagementObject#CIM_ManagedSystemElement
System.Management.ManagementObject
System.Management.ManagementBaseObject
System.ComponentModel.Component
System.MarshalByRefObject
System.Object

まとめ

何のために継承しているのか。 これを考えると継承元を避けたほうがいいと考えますが、状況によっては使えそうです。

また、PSTypeNamesはPowerShell 2.0では存在せずPowerShell 3.0からの追加であることは注記しておきます。 次回は、Wmi Objectの一覧取得を紹介します。