次の方法で共有


about_WQL

簡単な説明

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

詳細な説明

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

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

WQL を使用するために必要な基本的な WQL ステートメントは、 SELECTWHERE、および FROMです。

WQL を使用するタイミング

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

帯域幅に制約のあるリモート システム全体から大量のデータを返す場合を除き、同じことを行う許容可能な PowerShell コマンドレットがある場合、複雑な WQL クエリを完成させるために数時間を費やすことは、ほとんど生産的ではありません。

SELECT ステートメントの使用

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

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

SELECT <property> FROM <WMI-class>

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

SELECT * FROM Win32_Bios

Note

PowerShell には、既定のオブジェクト プロパティのみが表示されます。 これらのプロパティは、 Types.ps1xml ファイルで定義されます。 Select-Object コマンドレットまたは Format-* コマンドレットを使用して、追加のプロパティを表示します。

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 の Name および Version プロパティのみを取得します。

$queryNameVersion = "SELECT Name, Version FROM Win32_Bios"
Get-WmiObject -Query $queryNameVersion
__GENUS          : 2
__CLASS          : Win32_BIOS
__SUPERCLASS     :
__DYNASTY        :
__RELPATH        :
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : S03KT39A
Version          : LENOVO - 1270
PSComputerName   :

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 : 2
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :
Name             : S03KT39A
Version          : LENOVO - 1270
PSComputerName   :

Get-CimInstance コマンドレットの使用

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

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

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

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

Get-CimInstance -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : S03KT39A
Manufacturer      : LENOVO
Name              : S03KT39A
SerialNumber      : MJ0AETTX
Version           : LENOVO - 1270

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

PS> (Get-CimInstance -Query "SELECT * FROM Win32_Bios").GetType().FullName
Microsoft.Management.Infrastructure.CimInstance

PS> (Get-WmiObject -Query "SELECT * FROM Win32_Bios").GetType().FullName
System.Management.ManagementObject

wmisearcher 型アクセラレータの使用

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

[wmisearcher]を使用すると、ManagementObjectSearcher .NET クラスに簡単にアクセスできます。 これにより、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

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

[wmisearcher]$bios = "SELECT * FROM Win32_Bios"
$bios.Get()
SMBIOSBIOSVersion : S03KT39A
Manufacturer      : LENOVO
Name              : S03KT39A
SerialNumber      : MJ0AETTX
Version           : LENOVO - 1270

[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             : S03KT39A
PSComputerName   :

基本的な 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 条件を指定します。

$getWmiObjectSplat = @{
    Class = 'Win32_Process'
    Property = 'Name', 'ProcessID'
    Filter = "ProcessID >= 1004"
}
Get-WmiObject @getWmiObjectSplat |
    Sort-Object ProcessID |
    Select-Object 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 don't 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 don't 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: [<range>]

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

クエリは、 Hotepad.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 ワイルドカード文字です。 PowerShell のアスタリスク (*) ワイルドカードと同じです。

$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.exeExcel.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 演算子を、最初に処理する句を WMI に指示するかっこと組み合わせることができます。

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

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 オブジェクトのプロパティでブール値を取得するには、 TrueFalseを使用します。 大文字と小文字は区別されません。

次の 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

関連項目