about_WQL

簡単な説明

WMI Query Language (WQL) について説明します。これは Windows PowerShell で WMI オブジェクトを取得するために使用できます。

長い説明

WQL は、WMI から情報を取得するために使用される言語である Windows Management Instrumentation (WMI) クエリ言語です。

WQL を使用して、Windows PowerShellで WMI クエリを実行する必要はありません。 代わりに、Get-WmiObject または Get-CimInstance コマンドレットのパラメーターを使用できます。 WQL クエリは標準のGet-WmiObject コマンドよりもやや高速であり、コマンドが何百ものシステムで実行されている場合にパフォーマンスが向上することは明らかです。 ただし、WQL クエリの成功に費やす時間がパフォーマンスの向上よりも大きくないことを確認してください。

WQL を使用するために必要な基本的な WQL ステートメントは、Select、Where、From です。

WQL を使用するタイミング

WMI、特に WQL を使用する場合は、Windows PowerShellも使用していることを忘れないでください。 多くの場合、WQL クエリが期待どおりに機能しない場合は、WQL クエリをデバッグするよりも、標準のWindows PowerShell コマンドを使用する方が簡単です。

帯域幅に制約のあるリモート システム全体から大量のデータを返さない限り、同じことを行う完全に受け入れ可能な Windows コマンドレットがある場合に、複雑で複雑な WQL クエリを完成させようとする時間を費やすことは、生産性が低下することはほとんどありません。

SELECT ステートメントの使用

一般的な WMI クエリは、WMI クラスのすべてのプロパティまたは特定のプロパティを取得する Select ステートメントで始まります。 WMI クラスのすべてのプロパティを選択するには、アスタリスク (*) を使用します。 From キーワードは、WMI クラスを指定します。

Select ステートメントの形式は次のとおりです。

Select <property> from <WMI-class>

たとえば、次の Select ステートメントは、Win32_Bios WMI クラスのインスタンスからすべてのプロパティ (*) を選択します。

Select * from Win32_Bios

WMI クラスの特定のプロパティを選択するには、Select キーワードと From キーワードの間にプロパティ名を配置します。

次のクエリでは、WIN32_BIOS WMI クラスから BIOS の名前のみを選択します。 コマンドは、クエリを $queryName 変数に保存します。

Select Name from Win32_Bios

複数のプロパティを選択するには、コンマを使用してプロパティ名を区切ります。 次の WMI クエリは、Win32_Bios WMI クラスの名前とバージョンを選択します。 コマンドは、クエリを $queryNameVersion 変数に保存します。

Select name, version from Win32_Bios

WQL クエリの使用

Windows PowerShell コマンドで WQL クエリを使用するには、3 つの方法があります。

  • Get-WmiObject コマンドレットを使用する
  • Get-CimInstance コマンドレットを使用する
  • [wmisearcher] 型アクセラレータを使用します。

GET-WMIOBJECT コマンドレットの使用

WQL クエリを使用する最も基本的な方法は、次の例に示すように、それを引用符 (文字列) で囲んでから、Get-WmiObject コマンドレットの Query パラメーターの値としてクエリ文字列を使用することです。

Get-WmiObject -Query "Select * from Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

次のコマンドに示すように、WQL ステートメントを変数に保存し、その変数を Query パラメーターの値として使用することもできます。

$query = "Select * from Win32_Bios"
Get-WmiObject -Query $query

いずれかの形式は、任意の WQL ステートメントで使用できます。 次のコマンドでは、$queryName 変数のクエリを使用して、システム BIOS の名前とバージョンのプロパティのみを取得します。

$queryNameVersion = "Select Name, Version from Win32_Bios"
Get-WmiObject -Query $queryNameVersion
__GENUS          : 2
__CLASS          : Win32_BIOS
__SUPERCLASS     :
__DYNASTY        :
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : Default System BIOS
Version          : LENOVO - 1360

Get-WmiObject コマンドレットのパラメーターを使用して、同じ結果を取得できることに注意してください。 たとえば、次のコマンドは、WIN32_BIOS WMI クラスのインスタンスの Name プロパティと Version プロパティの値も取得します。

Get-WmiObject -Class Win32_Bios -Property Name, Version
__GENUS          : 2
__CLASS          : Win32_BIOS
__SUPERCLASS     :
__DYNASTY        :
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : Default System BIOS
Version          : LENOVO - 1360

GET-CIMINSTANCE コマンドレットの使用

Windows PowerShell 3.0 以降では、Get-CimInstance コマンドレットを使用して WQL クエリを実行できます。

Get-CimInstanceは、WMI クラスを含む CIM 準拠クラスのインスタンスを取得します。 3.0 Windows PowerShell導入された CIM コマンドレットは、WMI コマンドレットと同じタスクを実行します。 CIM コマンドレットは、WS-Management (WSMan) 標準と共通情報モデル (CIM) 標準に準拠しています。これにより、コマンドレットは同じ手法を使用して、他のオペレーティング システムを実行している Windows コンピューターとコンピューターを管理できます。

次のコマンドでは、Get-CimInstance コマンドレットを使用して WQL クエリを実行します。

Get-WmiObjectで使用できる WQL クエリは、Get-CimInstance でも使用できます。

Get-CimInstance -Query "Select * from Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

Get-CimInstanceは、Get-WmiObjectが返す ManagementObject ではなく CimInstance オブジェクトを返しますが、オブジェクトは非常に似ています。

(Get-CimInstance -Query "Select * from Win32_Bios").GetType().FullName
Microsoft.Management.Infrastructure.CimInstance
(Get-WmiObject -Query "Select * from Win32_Bios").GetType().FullName
System.Management.ManagementObject

[wmisearcher] TYPE ACCELERATOR の使用

[wmisearcher] 型アクセラレータは、WQL ステートメント文字列から ManagementObjectSearcher オブジェクトを作成します。 ManagementObjectSearcher オブジェクトには多くのプロパティとメソッドがありますが、最も基本的なメソッドは Get メソッドで、指定した WMI クエリを呼び出して結果のオブジェクトを返します。

[wmisearcher] を使用すると、ManagementObjectSearcher .NET Framework クラスに簡単にアクセスできます。 これにより、WMI に対してクエリを実行し、クエリの実行方法を構成できます。

[wmisearcher] 型アクセラレータを使用するには:

  1. WQL 文字列を ManagementObjectSearcher オブジェクトにキャストします。
  2. ManagementObjectSearcher オブジェクトの Get メソッドを呼び出します。

たとえば、次のコマンドは、"すべて選択" クエリをキャストし、結果を $bios 変数に保存してから、$bios変数の ManagementObjectSearcher オブジェクトの Get メソッドを呼び出します。

$bios = [wmisearcher]"Select * from Win32_Bios"
$bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

注: 既定では、選択したオブジェクト プロパティのみが表示されます。 これらのプロパティは Types.ps1xml ファイルで定義されています。

[wmisearcher] 型アクセラレータを使用して、クエリまたは変数をキャストできます。 次の例では、[wmisearcher] 型アクセラレータを使用して変数をキャストしています。 結果は同じです。

[wmisearcher]$bios = "Select * from Win32_Bios"
$bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

[wmisearcher] 型アクセラレータを使用すると、次のコマンドに示すように、クエリ文字列が ManagementObjectSearcher オブジェクトに変更されます。

$a = "Select * from Win32_Bios"
$a.GetType().FullName
System.String

$a = [wmisearcher]"Select * from Win32_Bios"
$a.GetType().FullName
System.Management.ManagementObjectSearcher

このコマンド形式は、任意のクエリで機能します。 次のコマンドは、WIN32_BIOS WMI クラスの Name プロパティの値を取得します。

$biosname = [wmisearcher]"Select Name from Win32_Bios"
$biosname.Get()
__GENUS          : 2
__CLASS          : Win32_BIOS
__SUPERCLASS     :
__DYNASTY        :
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : Default System BIOS

この操作は 1 つのコマンドで実行できますが、コマンドの解釈はもう少し困難です。

この形式では、[wmisearcher] 型アクセラレータを使用して、WQL クエリ文字列を ManagementObjectSearcher にキャストし、オブジェクトの Get メソッドを 1 つのコマンドで呼び出します。 キャストされた文字列を囲むかっこ () を直接Windows PowerShellして、メソッドを呼び出す前に文字列をキャストします。

([wmisearcher]"Select name from Win32_Bios").Get()
__GENUS          : 2
__CLASS          : Win32_BIOS
__SUPERCLASS     :
__DYNASTY        :
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : Default System BIOS

基本的な WQL WHERE ステートメントの使用

Where ステートメントは、Select ステートメントが返すデータの条件を設定します。

Where ステートメントの形式は次のとおりです。

where <property> <operator> <value>

次に例を示します。

where Name = 'Notepad.exe'

次の例に示すように、Where ステートメントは Select ステートメントと共に使用されます。

Select * from Win32_Process where Name = 'Notepad.exe'

Where ステートメントを使用する場合、プロパティの名前と値は正確である必要があります。

たとえば、次のコマンドは、ローカル コンピューター上のメモ帳プロセスを取得します。

Get-WmiObject -Query "Select * from Win32_Process where name='Notepad.exe'"

ただし、プロセス名に ".exe" ファイル名拡張子が含まれているため、次のコマンドは失敗します。

Get-WmiObject -Query "Select * from Win32_Process where name='Notepad'"

WHERE ステートメント比較演算子

WQL Where ステートメントでは、次の演算子が有効です。

Operator    Description
-----------------------
=           Equal
!=          Not equal
<>          Not equal
<           Less than
>           Greater than
<=          Less than or equal
>=          Greater than or equal
LIKE        Wildcard match
IS          Evaluates null
ISNOT       Evaluates not null
ISA         Evaluates a member of a WMI class

他にも演算子がありますが、これらは比較に使用されます。

たとえば、次のクエリでは、プロセスの優先度が 11 以上のWin32_Process クラスのプロセスから Name プロパティと Priority プロパティを選択します。 Get-WmiObject コマンドレットはクエリを実行します。

$highPriority = "Select Name, Priority from Win32_Process " +
  "where Priority >= 11"
Get-WmiObject -Query $highPriority

FILTER パラメーターでの WQL 演算子の使用

WQL 演算子は、Get-WmiObject または Get-CimInstance コマンドレットの Filter パラメーターの値、およびこれらのコマンドレットの Query パラメーターの値でも使用できます。

たとえば、次のコマンドは、ProcessID 値が 1004 より大きい最後の 5 つのプロセスの Name プロパティと ProcessID プロパティを取得します。 コマンドは Filter パラメーターを使用して ProcessID 条件を指定します。

Get-WmiObject -Class Win32_Process `
-Property Name, ProcessID -Filter "ProcessID >= 1004" |
Sort ProcessID | Select Name, ProcessID -Last 5
Name                                 ProcessID
----                                 ---------
SROSVC.exe                                4220
WINWORD.EXE                               4664
TscHelp.exe                               4744
SnagIt32.exe                              4748
WmiPrvSE.exe                              5056

LIKE 演算子の使用

Like 演算子を使用すると、ワイルドカード文字を使用して WQL クエリの結果をフィルター処理できます。

Like Operator  Description
--------------------------------------------------
[]             Character in a range [a-f] or a set
               of characters [abcdef]. The items in
               a set do not need to be consecutive or
               listed in alphabetical order.

^              Character not in a range [^a-f] or
               not in a set [^abcdef]. The items in
               a set do not need to be consecutive or
               listed in alphabetical order.

%              A string of zero or more characters

_              One character.
(underscore)   NOTE: To use a literal underscore
               in a query string, enclose it in
               square brackets [_].

Like 演算子をワイルドカード文字または範囲演算子なしで使用すると、等値演算子 (=) のように動作し、オブジェクトがパターンと完全に一致する場合にのみオブジェクトを返します。

範囲操作とパーセント ワイルドカード文字を組み合わせて、シンプルで強力なフィルターを作成できます。

LIKE 演算子の例

例 1: [<範囲>]

次のコマンドは、メモ帳を起動し、"H" から "N" までの文字で始まる名前を持つ Win32_Process クラスのインスタンスを検索します (大文字と小文字は区別されません)。

クエリは、Hotpad.exeからNotepad.exeまでのプロセスを返す必要があります。

Notepad   # Starts Notepad
$query = "Select * from win32_Process where Name LIKE '[H-N]otepad.exe'"
Get-WmiObject -Query $query | Select Name, ProcessID
Name                                ProcessID
----                                ---------
notepad.exe                              1740

例 2: [<range>] と %

次のコマンドでは、A から P までの文字で始まる名前を持つすべてのプロセスを選択します (大文字と小文字は区別されません)。その後、任意の組み合わせで 0 文字以上の文字が続きます。

Get-WmiObject コマンドレットはクエリを実行し、Select-Object コマンドレットは Name プロパティと ProcessID プロパティを取得し、Sort-Object コマンドレットは結果を名前順にアルファベット順に並べ替えます。

$query = "Select * from win32_Process where name LIKE '[A-P]%'"
Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessID |
Sort-Object -Property Name

例 3: 範囲外 (^)

次のコマンドは、名前が A、S、W、P、R、C、U、N のいずれかの文字で始まっていないプロセスを取得します。

0 個以上の文字が続きます。

$query = "Select * from win32_Process where name LIKE '[^ASWPRCUN]%'"
Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessID |
Sort-Object -Property Name

例 4: 任意の文字 -- またはなし (%)

次のコマンドは、"calc" で始まる名前を持つプロセスを取得します。 WQL の % 記号は、正規表現のアスタリスク (*) 記号と同じです。

$query = "Select * from win32_Process where Name LIKE 'calc%'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name                               ProcessID
----                               ---------
calc.exe                                4424

例 5: 1 文字 (_)

次のコマンドは、アンダースコア文字が任意の 1 文字を表す "c_lc.exe" というパターンの名前を持つプロセスを取得します。 このパターンは、calc.exeからczlc.exeまたはc9lc.exeまでの任意の名前と一致しますが、"c" と "l" が複数の文字で区切られている名前と一致しません。

$query = "Select * from Win32_Process where Name LIKE 'c_lc.exe'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
Name                                 ProcessID
----                                 ---------
calc.exe                                  4424

例 6: 完全一致

次のコマンドは、WLIDSVC.exeという名前のプロセスを取得します。 クエリでは Like キーワードを使用しますが、値にワイルドカード文字が含まれていないため、完全に一致する必要があります。

$query = "Select * from win32_Process where name LIKE 'WLIDSVC.exe'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessID
```powershell

```output
Name                                 ProcessID
----                                 ---------
WLIDSVC.exe                                84

OR 演算子の使用

複数の独立した条件を指定するには、Or キーワードを使用します。 Or キーワードは Where 句に表示されます。 2 つ以上の条件に対して包括 OR 演算を実行し、いずれかの条件を満たす項目を返します。

Or 演算子の形式は次のとおりです。

Where <property> <operator> <value> or <property> <operator> <value> ...

たとえば、次のコマンドは、Win32_Process WMI クラスのすべてのインスタンスを取得しますが、プロセス名がwinword.exeまたはexcel.exe場合にのみそれらを返します。

$q = "Select * from Win32_Process where Name='winword.exe'" +
  " or Name='excel.exe'"
Get-WmiObject -Query $q

Or ステートメントは、2 つ以上の条件で使用できます。 次のクエリでは、Or ステートメントがWinword.exe、Excel.exe、またはPowershell.exeを取得します。

$q = "Select * from Win32_Process where Name='winword.exe'" +
  " or Name='excel.exe' or Name='powershell.exe'"

AND 演算子の使用

複数の関連条件を指定するには、And キーワードを使用します。 And キーワードは Where 句に表示されます。 すべての条件を満たす項目が返されます。

And 演算子の形式は次のとおりです。

Where <property> <operator> <value> and <property> <operator> <value> ...

たとえば、次のコマンドは、"Winword.exe" という名前のプロセスと 6512 のプロセス ID を取得します。

コマンドでは、Get-CimInstance コマンドレットが使用されることに注意してください。

$q = "Select * from Win32_Process where Name = 'winword.exe' " +
  "and ProcessID =6512"
Get-CimInstance -Query $q
ProcessId   Name             HandleCount      WorkingSetSize   VirtualSize
---------   ----             -----------      --------------   -----------
# 6512      WINWORD.EXE      768              117170176        633028608

Like 演算子を含むすべての演算子は、Or 演算子と And 演算子で有効です。 また、1 つのクエリで Or 演算子と And 演算子を、最初に処理する句Windows PowerShell示すかっこと組み合わせることができます。

このコマンドでは、Windows PowerShell継続文字 (`) を使用して、コマンドを 2 行に分割します。

$q = "Select * from Win32_Process `
where (Name = 'winword.exe' or Name = 'excel.exe') and HandleCount > 700"
Get-CimInstance -Query $q
ProcessId    Name             HandleCount      WorkingSetSize   VirtualSize
---------    ----             -----------      --------------   -----------
     6512    WINWORD.EXE      797              117268480        634425344
     9610    EXCEL.EXE        727               38858752        323227648

NULL 値の検索

WMI で null 値を検索するのは困難です。これは、予期しない結果につながる可能性があるためです。 Null は 0 ではなく、または空の文字列と同等ではありません。 一部の WMI クラス プロパティは初期化され、それ以外のプロパティは初期化されないため、null の検索がすべてのプロパティに対して機能しない場合があります。

null 値を検索するには、値が "null" の Is 演算子を使用します。

たとえば、次のコマンドは、IntallDate プロパティの null 値を持つプロセスを取得します。 コマンドは多くのプロセスを返します。

$q = "Select * from Win32_Process where InstallDate is null"
Get-WmiObject -Query $q

これに対し、次のコマンドでは、Description プロパティの null 値を持つユーザー アカウントを取得します。 ほとんどのユーザー アカウントに Description プロパティの値がない場合でも、このコマンドはユーザー アカウントを返しません。

$q = "Select * from Win32_UserAccount where Description is null"
Get-WmiObject -Query $q

Description プロパティの値がないユーザー アカウントを検索するには、等値演算子を使用して空の文字列を取得します。 空の文字列を表すには、2 つの連続する単一引用符を使用します。

$q = "Select * from Win32_UserAccount where Description = '' "

TRUE または FALSE の使用

WMI オブジェクトのプロパティでブール値を取得するには、True と False を使用します。 大文字と小文字は区別されません。

次の WQL クエリは、ドメインに参加しているコンピューターからローカル ユーザー アカウントのみを返します。

$q = "Select * from Win32_UserAccount where LocalAccount = True"
Get-CimInstance -Query $q

ドメイン アカウントを検索するには、次の例に示すように False の値を使用します。

$q = "Select * from Win32_UserAccount where LocalAccount = False"
Get-CimInstance -Query $q

エスケープ文字の使用

WQL では、エスケープ文字として円記号 (\) が使用されます。 これは、バックティック文字 (`) を使用するWindows PowerShellとは異なります。

引用符と引用符に使用される文字は、多くの場合、誤って解釈されないようにエスケープする必要があります。

名前に単一引用符が含まれるユーザーを検索するには、次のコマンドに示すように、円記号を使用して単一引用符をエスケープします。

$q = "Select * from Win32_UserAccount where Name = 'Tim O\'Brian'"
Get-CimInstance -Query $q
Name             Caption          AccountType      SID              Domain
----             -------          -----------      ---              ------
Tim O'Brian      FABRIKAM\TimO    512              S-1-5-21-1457... FABRIKAM

場合によっては、円記号もエスケープする必要があります。 たとえば、次のコマンドでは、Caption 値の円記号が原因で無効なクエリ エラーが生成されます。

$q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\TimO'"
Get-CimInstance -Query $q
Get-CimInstance : Invalid query
At line:1 char:1
+ Get-CimInstance -Query $q
+ ~~~~~~~~~~~
  + CategoryInfo          : InvalidArgument: (:) [Get-CimInstance], CimExcep
  + FullyQualifiedErrorId : HRESULT 0x80041017,Microsoft.Management.Infrastr

円記号をエスケープするには、次のコマンドに示すように、2 番目の円記号を使用します。

$q = "Select * from Win32_UserAccount where Caption = 'Fabrikam\\TimO'"
Get-CimInstance -Query $q

関連項目