about_WQL

簡単な説明

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

詳細な説明

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

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

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

WQL を使用するタイミング

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

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

SELECT ステートメントの使用

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

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

SELECT <property> FROM <WMI-class>

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

SELECT * FROM Win32_Bios

Note

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

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

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

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 Get-WmiObject ではなく CimInstance オブジェクトを返しますが、オブジェクトは非常に似ています。

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変数に保存してから、ManagementObjectSearcher オブジェクトのメソッドを$bios変数に呼び出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 演算子は、これらのコマンドレットの Query パラメーターの値だけでなく、またはGet-CimInstanceコマンドレットの Get-WmiObject Filter パラメーターの値でも使用できます。

たとえば、次のコマンドは、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: [<範囲>]

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

クエリは、次のプロセスをHotepad.exeNotepad.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: [<範囲>] と %

次のコマンドでは、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 次のパターンを持つ名前を持つプロセスを取得します。 このパターンは、c9lc.exe"c" と "l" が複数の文字で区切られている名前と一致calc.execzlc.exeしません。

$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のプロセスを取得します。 クエリではキーワード (keyword)が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 演算子の使用

複数の独立した条件を指定するには、キーワード (keyword)をOR使用します。 句にORキーワード (keyword)がWHERE表示されます。 2 つ以上の条件に対して包括的 OR な操作を実行し、いずれかの条件を満たす項目を返します。

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

WHERE <property> <operator> <value> OR <property> <operator> <value> ...

たとえば、次のコマンドは、Win32_Process WMI クラスのすべてのインスタンスを取得しますが、プロセス名が winword.exeexcel.exe.

$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
  " OR Name='excel.exe'"
Get-WmiObject -Query $q

ステートメントは OR 、2 つ以上の条件で使用できます。 次のクエリでは、ステートメントは ORWinword.exeまたは Excel.exePowershell.exe.

$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
  " OR Name='excel.exe' OR Name='powershell.exe'"

AND 演算子の使用

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

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

WHERE <property> <operator> <value> `AND` <property> <operator> <value> ...

たとえば、次のコマンドは、6512 という Winword.exe 名前とプロセス 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含むすべての演算子は、and AND 演算子でOR有効です。 また、1 つのクエリ内の and 演算子とAND、最初にOR処理する句を WMI に指示するかっこを組み合わせることができます。

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

null 値の検索

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

null 値を検索するには、Is 演算子を使用して値 nullを指定します。

たとえば、次のコマンドは、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 クエリでは、doメイン 参加しているコンピューターからローカル ユーザー アカウントのみが返されます。

$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = True"
Get-CimInstance -Query $q

doメイン アカウントを検索するには、次の例に示すように 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

関連項目