[PowerShell実践] 第3回 WMI 関連の Cmdlet (Get-WmiObject)


スポンサーリンク


この章の目次と概要です。

WMI 関連の Cmdlet の種類

WMI (Windows Management Instrumentation) はローカル及びリモートサーバーを管理するために使用される Windows OS のインターフェースです。

WMI を使用するために、PowerShell 2.0 から 5 つの Cmdlet が用意されています。
以下は、PowerShell の Get-Command で WMI を含む Cmdlet を表示しています。

PS C:\> Get-Command | findstr /I WMI
Cmdlet     Get-WmiObject             Microsoft.PowerShell.Management
Cmdlet     Invoke-WmiMethod          Microsoft.PowerShell.Management
Cmdlet     Register-WmiEvent         Microsoft.PowerShell.Management
Cmdlet     Remove-WmiObject          Microsoft.PowerShell.Management
Cmdlet     Set-WmiInstance           Microsoft.PowerShell.Management
PS C:\>

 
各 Cmdlet は以下の機能があります。

今回は、Get-WmiObject について記述していますが、他の Cmdlet について記述していますので、気になる Cmdlet がありましたら参照ください。

表. WMI関連のコマンドレット(Cmdlet)
Cmdlet 機能
Get-WmiObject WMI クラスのインスタンスまたは使用可能なクラスに関する情報を取得する。
Invoke-WmiMethod WMI メソッドを呼び出す。
Register-WmiEvent WMI イベントをサブスクライブする。
Remove-WmiObject 既存の WMI クラスのインスタンスを削除する。
Set-WmiInstance 既存の WMI クラスのインスタンスを作成または更新する。

クラスとインスタンスとは

クラスとインタンスの関係は、Java 等のオブジェクト指向のプログラミング言語に出てくる用語と同じ意味です。

クラスにはプロパティとメソッドがあります。

例えば、WMI クラスの 1 つに、Win32_OperatingSystem という OS に関する情報(プロパティ)や機能(メソッド)を持つクラスがあります。

このクラスのプロパティには SystemDrive (システムドライブ名) や CSName (コンピュータ名) 等があり、メソッドには Reboot (OS再起動) や Shutdown (OS停止) 等があります。

このクラスを具体的な PC やサーバーと紐付けたものがインスタンスとなります。

つまり、、

サーバーA の Win32_OperatingSystem インスタンスを取得し、CSName を参照すれば、サーバーA のコンピュータ名が取得できます。

サーバーB の Win32_OperatingSystem インスタンスを取得し、CSName を参照すれば、サーバーB のコンピュータ名が取得できます。

PowerShell での具体的な実行方法は以下のようになります。
Win32_OperatingSystem クラスのインスタンスを取得し、CSName プロパティを参照しています。

C:\> powershell
Windows PowerShell
Copyright (C) 2012 Microsoft Corporation. All rights reserved.

PS C:\> Get-WmiObject Win32_OperatingSystem -ComputerName ServerA | foreach { $_.CSName}
ServerA         ・・・(1)
PS C:\> Get-WmiObject Win32_OperatingSystem -ComputerName ServerB | foreach { $_.CSName}
ServerB         ・・・(2)
PS C:\>

各行の説明
(1) ServerA のコンピュータ名の取得結果。
(2) ServerB のコンピュータ名の取得結果。

Get-WmiObject の使い方

前項で Get-WmiObject で Win32_OperatingSystem のインスタンスを作成しましたが、他にもいろいろと使い方があります。

表. Get-WmiObject の使用例
コマンド 処理
Get-WmiObject -List WMI クラスの一覧を表示。
Get-WmiObject <クラス名> ローカルサーバーに対する <クラス名> のインスタンスを取得。
Get-WmiObject <クラス名>
 -ComputerName <サーバー名>
<サーバー名> に対する <クラス名> のインスタンスを取得。
<サーバー名> を . (ドット) にすれば、インスタンスの取得先はローカルサーバーとなる。
Get-WmiObject <クラス名>
 | Get-Member
<クラス名> が持つメソッドやプロパティの一覧を表示。
Get-WmiObject Win32_OperatingSystem
 -ComputerName ServerA,ServerB
 | Format-List CSName,LastBootupTime
ServerA と ServerB の CSName(コンピュータ名) と LastBootupTime (最後のOS起動時間) を取得。

 

以下は、Get-WmiObject の実行例です。

PS C:\> Get-WmiObject -List  | Select-String LogicalDisk         ・・・(1)

\\ServerA\ROOT\cimv2:CIM_LogicalDisk
\\ServerA\ROOT\cimv2:Win32_LogicalDisk
\\ServerA\ROOT\cimv2:Win32_MappedLogicalDisk
\\ServerA\ROOT\cimv2:CIM_LogicalDiskBasedOnPartition
\\ServerA\ROOT\cimv2:Win32_LogicalDiskToPartition
\\ServerA\ROOT\cimv2:CIM_LogicalDiskBasedOnVolumeSet
\\ServerA\ROOT\cimv2:Win32_LogicalDiskRootDirectory
\\ServerA\root\cimv2:Win32_PerfFormattedData_PerfDisk_LogicalDisk
\\ServerA\root\cimv2:Win32_PerfRawData_PerfDisk_LogicalDisk


PS C:\> Get-WmiObject Win32_LogicalDisk | Get-Member         ・・・(2)


   TypeName: System.Management.ManagementObject#root\cimv2\Win32_LogicalDisk

Name                         MemberType    Definition
----                         ----------    ----------
PSComputerName               AliasProperty PSComputerName = __SERVER
Chkdsk                       Method        System.Management.ManagementBaseObject Chkdsk(System.Boolean FixErrors, System.Boolean Vigoro...
Reset                        Method        System.Management.ManagementBaseObject Reset()
SetPowerState                Method        System.Management.ManagementBaseObject SetPowerState(System.UInt16 PowerState, System.String ...
Access                       Property      uint16 Access {get;set;}
Availability                 Property      uint16 Availability {get;set;}
BlockSize                    Property      uint64 BlockSize {get;set;}
Caption                      Property      string Caption {get;set;}
Compressed                   Property      bool Compressed {get;set;}
ConfigManagerErrorCode       Property      uint32 ConfigManagerErrorCode {get;set;}
ConfigManagerUserConfig      Property      bool ConfigManagerUserConfig {get;set;}
CreationClassName            Property      string CreationClassName {get;set;}
Description                  Property      string Description {get;set;}
DeviceID                     Property      string DeviceID {get;set;}
DriveType                    Property      uint32 DriveType {get;set;}
ErrorCleared                 Property      bool ErrorCleared {get;set;}
ErrorDescription             Property      string ErrorDescription {get;set;}
ErrorMethodology             Property      string ErrorMethodology {get;set;}
FileSystem                   Property      string FileSystem {get;set;}
FreeSpace                    Property      uint64 FreeSpace {get;set;}
InstallDate                  Property      string InstallDate {get;set;}
LastErrorCode                Property      uint32 LastErrorCode {get;set;}
MaximumComponentLength       Property      uint32 MaximumComponentLength {get;set;}
MediaType                    Property      uint32 MediaType {get;set;}
Name                         Property      string Name {get;set;}
NumberOfBlocks               Property      uint64 NumberOfBlocks {get;set;}
PNPDeviceID                  Property      string PNPDeviceID {get;set;}
PowerManagementCapabilities  Property      uint16[] PowerManagementCapabilities {get;set;}
PowerManagementSupported     Property      bool PowerManagementSupported {get;set;}
ProviderName                 Property      string ProviderName {get;set;}
Purpose                      Property      string Purpose {get;set;}
QuotasDisabled               Property      bool QuotasDisabled {get;set;}
QuotasIncomplete             Property      bool QuotasIncomplete {get;set;}
QuotasRebuilding             Property      bool QuotasRebuilding {get;set;}
Size                         Property      uint64 Size {get;set;}
Status                       Property      string Status {get;set;}
StatusInfo                   Property      uint16 StatusInfo {get;set;}
SupportsDiskQuotas           Property      bool SupportsDiskQuotas {get;set;}
SupportsFileBasedCompression Property      bool SupportsFileBasedCompression {get;set;}
SystemCreationClassName      Property      string SystemCreationClassName {get;set;}
SystemName                   Property      string SystemName {get;set;}
VolumeDirty                  Property      bool VolumeDirty {get;set;}
VolumeName                   Property      string VolumeName {get;set;}
VolumeSerialNumber           Property      string VolumeSerialNumber {get;set;}
__CLASS                      Property      string __CLASS {get;set;}
__DERIVATION                 Property      string[] __DERIVATION {get;set;}
__DYNASTY                    Property      string __DYNASTY {get;set;}
__GENUS                      Property      int __GENUS {get;set;}
__NAMESPACE                  Property      string __NAMESPACE {get;set;}
__PATH                       Property      string __PATH {get;set;}
__PROPERTY_COUNT             Property      int __PROPERTY_COUNT {get;set;}
__RELPATH                    Property      string __RELPATH {get;set;}
__SERVER                     Property      string __SERVER {get;set;}
__SUPERCLASS                 Property      string __SUPERCLASS {get;set;}
PSStatus                     PropertySet   PSStatus {Status, Availability, DeviceID, StatusInfo}
ConvertFromDateTime          ScriptMethod  System.Object ConvertFromDateTime();
ConvertToDateTime            ScriptMethod  System.Object ConvertToDateTime();


PS C:\> Get-WmiObject Win32_LogicalDisk | Format-List SystemName,Caption,Size         ・・・(3)


SystemName : ServerA
Caption    : C:
Size       : 301720399872

SystemName : ServerA
Caption    : D:
Size       : 16777211904



PS C:\>

各行の説明
(1) LogicalDisk を含むクラス名を検索。
(2) Win32_LogicalDisk クラスのメソッド/プロパティを確認。
(3) ローカルサーバーの Win32_LogicalDisk インスタンスを取得し、SystemName, Caption, Size を参照。

リモートサーバー接続時にユーザー/パスワードを指定

リモートサーバーに接続する際は、-ComputerName <接続先> を指定しますが、ユーザー/パスワードを指定する際は -Credential を使用します。

以下は実行例です。
接続先のサーバーは WIN2012R2Srv、ユーザーは administrator、パスワードは password (実際にはありえないパスワードですが) としています。

C:\> powershell
Windows PowerShell
Copyright (C) 2012 Microsoft Corporation. All rights reserved.

PS C:\> $password = "password" | ConvertTo-SecureString -asPlainText -Force   ・・・(1)
PS C:\> $credential = New-Object System.Management.Automation.PSCredential("administrator",$password)
     ・・・(2)
PS C:\> Get-WmiObject Win32_OperatingSystem -ComputerName WIN2012R2Srv -Credential $credential
     ・・・(3)

各行の説明
(1) パスワードを String から SecureString に変換。
(2) ユーザー名とパスワードから Credential を作成。
(3) Get-WmiObject の -Credential で作成した $credential を指定。

 
スポンサーリンク