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) の間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 クエリを使用する最も基本的な方法は、次の例に示すように、それを引用符 (文字列) で囲み、クエリ文字列をコマンドレットの 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]
使用するには:
- WQL 文字列を ManagementObjectSearcher オブジェクトにキャストします。
- 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.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: [<範囲>] と %
次のコマンドでは、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.exe
czlc.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.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 演算子の使用
複数の関連条件を指定するには、キーワード (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
関連項目
PowerShell