興味深く有意義な記事があったので確認しました。
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_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を超えました。
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 2.0では存在せずPowerShell 3.0からの追加であることは注記しておきます。 次回は、Wmi Objectの一覧取得を紹介します。