tech.guitarrapc.cóm

Technical updates

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

興味深く有意義な記事があったので確認しました。
Displaying WMI Inheritance
PowerShell V3.0からは、PSTypeNamesというGet-Memberでは表示されない隠れたプロパティが存在します。 このPSTypeNamesを利用することで、WMI Objectの継承ツリーが確認出来るようになりました。 これにより、継承元の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
ここで、三つの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を超えましたww
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 V2.0では存在せずPowerShell V3.0からの追加であることは注記しておきます。 次回は、Wmi Objectの一覧取得を紹介します。