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 ステートメントは、 SELECT
、 WHERE
、および 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
キーワードの間にプロパティ名を配置します。
次のクエリでは、$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]
型アクセラレータを使用するには:
- WQL 文字列を ManagementObjectSearcher オブジェクトにキャストします。
- 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.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
演算子を、最初に処理する句を 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 オブジェクトのプロパティでブール値を取得するには、 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
関連項目
PowerShell