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
です。
WMI、特に WQL を使用する場合は、Windows PowerShell も使用していることを忘れないでください。 多くの場合、WQL クエリが期待どおりに動作しない場合は、WQL クエリをデバッグするよりも、標準の Windows PowerShell コマンドを使用する方が簡単です。
帯域幅に制約のあるリモート システム全体から大量のデータを返す場合を除き、同じことを行う許容可能な PowerShell コマンドレットがある場合、複雑な WQL クエリを完成させるために数時間を費やすことは、ほとんど生産的ではありません。
一般的な WMI クエリは、WMI クラスのすべてのプロパティまたは特定のプロパティを取得する SELECT
ステートメントで始まります。 WMI クラスのすべてのプロパティを選択するには、アスタリスク (*
) を使用します。
FROM
キーワードは、WMI クラスを指定します。
SELECT
ステートメントの形式は次のとおりです。
SELECT <property> FROM <WMI-class>
たとえば、次の SELECT
ステートメントは、*
WMI クラスのインスタンスからすべてのプロパティ () を選択します。
SELECT * FROM Win32_Bios
注意
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
Windows PowerShell コマンドで WQL クエリを使用するには、3 つの方法があります。
-
Get-WmiObject
コマンドレットを使用する -
Get-CimInstance
コマンドレットを使用する -
[wmisearcher]
型アクセラレータを使用します。
WQL クエリを使用する最も基本的な方法は、次の例に示すように、 コマンドレットの 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 :
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]
型アクセラレータは、WQL ステートメント文字列から ManagementObjectSearcher オブジェクトを作成します。
ManagementObjectSearcher オブジェクトには多くのプロパティとメソッドがありますが、最も基本的なメソッドは、指定された WMI クエリを呼び出し、結果のオブジェクトを返す Get メソッドです。
[wmisearcher]
を使用すると、ManagementObjectSearcher .NET クラスに簡単にアクセスできます。 これにより、WMI に対してクエリを実行し、クエリの実行方法を構成できます。
[wmisearcher]
型アクセラレータを使用するには:
- WQL 文字列を ManagementObjectSearcher オブジェクトにキャストします。
- ManagementObjectSearcher オブジェクトの Get メソッドを呼び出します。
たとえば、次のコマンドは、"すべて選択" クエリをキャストし、結果を$bios
変数に保存してから、Get()
変数の ManagementObjectSearcher オブジェクトの$bios
メソッドを呼び出します。
$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 :
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'"
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
WQL 演算子は、 または Get-WmiObject
コマンドレットの Get-CimInstance
パラメーターの値、およびこれらのコマンドレットの 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
演算子を使用すると、ワイルドカード文字を使用して 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
演算子を使用すると、等値演算子 (=
) のように動作し、オブジェクトがパターンと完全に一致する場合にのみオブジェクトを返します。
範囲操作とパーセント (%
) ワイルドカード文字を組み合わせて、単純で強力なフィルターを作成できます。
次のコマンドはメモ帳を起動し、名前が "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
次のコマンドでは、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
次のコマンドは、名前が 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
次のコマンドは、 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
次のコマンドは、アンダースコア文字が任意の 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
次のコマンドは、 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
キーワードは、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
キーワードは、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 行に分割します。
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 = '' "
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 に関するフィードバック
PowerShell はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。