興味深く有意義な記事があったので確認しました。
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_LogicalElement
や
CIM_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_LogicalElement
や
CIM_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の一覧取得を紹介します。