Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Krátký popis
Popisuje jazyk WMI Query Language (WQL), který lze použít k získání objektů WMI v prostředí Windows PowerShell.
Dlouhý popis
WQL je dotazovací jazyk WMI (Windows Management Instrumentation), což je jazyk používaný k získání informací z rozhraní WMI.
K provedení dotazu rozhraní WMI ve Windows PowerShellu se nevyžaduje použití jazyka WQL.
Místo toho můžete použít parametry Get-WmiObject
těchto rutin Get-CimInstance
. Dotazy WQL jsou poněkud rychlejší než standardní Get-WmiObject
příkazy a lepší výkon je zřejmé, když příkazy běží ve stovkách systémů. Ujistěte se ale, že čas strávený zápisem úspěšného dotazu WQL nepřeváží nad zlepšením výkonu.
Základní příkazy jazyka WQL, které potřebujete použít, jsou SELECT
, WHERE
a FROM
.
Kdy použít jazyk WQL
Při práci s rozhraním WMI a zejména s jazykem WQL nezapomeňte, že používáte také Windows PowerShell. Pokud dotaz WQL často nefunguje podle očekávání, je jednodušší použít standardní příkaz Windows PowerShellu než ladit dotaz WQL.
Pokud nevracíte obrovské objemy dat z různých vzdálených systémů omezených šířkou pásma, je zřídka produktivní strávit hodiny pokusem o perfektní složitý dotaz WQL, pokud existuje přijatelná rutina PowerShellu, která dělá totéž.
Použití příkazu SELECT
Typický dotaz rozhraní WMI začíná příkazem SELECT
, který získá všechny vlastnosti nebo konkrétní vlastnosti třídy WMI. Chcete-li vybrat všechny vlastnosti třídy WMI, použijte hvězdičku (*
). Klíčové FROM
slovo určuje třídu WMI.
Příkaz SELECT
má následující formát:
SELECT <property> FROM <WMI-class>
Například následující příkaz SELECT
vybere všechny vlastnosti (*
) z instancí Win32_BIOS třídy WMI.
SELECT * FROM Win32_BIOS
Poznámka:
PowerShell zobrazí jenom výchozí vlastnosti objektu. Tyto vlastnosti jsou definovány v Types.ps1xml
souboru.
Select-Object
K zobrazení dalších vlastností použijte rutinu nebo rutinuFormat-*
.
Chcete-li vybrat konkrétní vlastnost třídy WMI, umístěte název vlastnosti mezi SELECT
klíčové slovo a FROM
klíčové slovo.
Následující dotaz vybere pouze název systému BIOS z třídy Win32_BIOS WMI. Příkaz uloží dotaz do $queryName
proměnné.
SELECT Name FROM Win32_BIOS
Pokud chcete vybrat více než jednu vlastnost, oddělte názvy vlastností čárkami.
Následující dotaz rozhraní WMI vybere název a verzi třídy služby WMI Win32_BIOS. Příkaz uloží dotaz do $queryNameVersion
proměnné.
SELECT name, version FROM Win32_BIOS
Použití dotazu WQL
Existují tři způsoby použití dotazu WQL v příkazu Windows PowerShellu.
- Použití rutiny
Get-WmiObject
- Použití rutiny
Get-CimInstance
-
[wmisearcher]
Použijte akcelerátor typů.
Použití rutiny Get-WmiObject
Nejzákladnější způsob, jak použít dotaz WQL, je uzavřít ho do uvozovek (jako řetězec) a pak použít řetězec dotazu jako hodnotu parametru Query rutiny Get-WmiObject
, jak je znázorněno v následujícím příkladu.
Get-WmiObject -Query "SELECT * FROM Win32_BIOS"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO - 1360
Příkaz WQL můžete také uložit do proměnné a pak tuto proměnnou použít jako hodnotu parametru Dotazu , jak je znázorněno v následujícím příkazu.
$query = "SELECT * FROM Win32_BIOS"
Get-WmiObject -Query $query
Libovolný formát můžete použít s libovolným příkazem WQL. Následující příkaz pomocí dotazu v $queryName
proměnné získá pouze vlastnosti Name a Version systému BIOS.
$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 :
Mějte na paměti, že ke stejnému výsledku Get-WmiObject
můžete použít parametry rutiny. Například následující příkaz získá také hodnoty Name a Version vlastnosti instancí Win32_BIOS třídy WMI.
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 :
Použití rutiny Get-CimInstance
Počínaje Windows PowerShellem 3.0 můžete pomocí Get-CimInstance
rutiny spouštět dotazy WQL.
Get-CimInstance
získá instance tříd kompatibilních s CIM, včetně tříd WMI. Rutiny CIM, zavedené prostředí Windows PowerShell 3.0, provádějí stejné úlohy jako rutiny rozhraní WMI. Rutiny CIM splňují standardy WS-Management (WSMan) a standard CIM (Common Information Model), který umožňuje rutinám používat stejné techniky ke správě počítačů a počítačů s Windows, na kterých běží jiné operační systémy.
Následující příkaz používá rutinu Get-CimInstance
ke spuštění dotazu WQL.
Jakýkoli dotaz WQL, se kterým lze použít Get-WmiObject
, lze použít také s Get-CimInstance
.
Get-CimInstance -Query "SELECT * FROM Win32_BIOS"
SMBIOSBIOSVersion : S03KT39A
Manufacturer : LENOVO
Name : S03KT39A
SerialNumber : MJ0AETTX
Version : LENOVO - 1270
Get-CimInstance
vrátí objekt CimInstance namísto objektu ManagementObject, který Get-WmiObject
vrací, ale objekty jsou poměrně podobné.
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
Použití akcelerátoru typů wmisearcheru
Akcelerátor [wmisearcher]
typů vytvoří objekt ManagementObjectSearcher z řetězce příkazu WQL. ManagementObjectSearcher objekt má mnoho vlastností a metod, ale nejzásadnější metoda je Get metoda, která vyvolá zadaný dotaz WMI a vrátí výsledné objekty.
Pomocí [wmisearcher]
, získáte snadný přístup k ManagementObjectSearcher .NET třídy. Díky tomu se můžete dotazovat na rozhraní WMI a nakonfigurovat způsob, jakým se dotaz provádí.
Použití akcelerátoru [wmisearcher]
typů:
- Přetypujte řetězec WQL do objektu ManagementObjectSearcher .
- Volání Get metoda ManagementObjectSearcher objektu.
Například následující příkaz přetypuje dotaz "select all", uloží výsledek do $bios
proměnné a potom zavolá Get()
metodu Objekt ManagementObjectSearcher v $bios
proměnné.
$bios = [wmisearcher]"SELECT * FROM Win32_BIOS"
$bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9FPY3P
Version : LENOVO - 1360
Pomocí akcelerátoru [wmisearcher]
typů můžete přetypovat dotaz nebo proměnnou. V následujícím příkladu [wmisearcher]
se akcelerátor typu používá k přetypování proměnné. Výsledek je stejný.
[wmisearcher]$bios = "SELECT * FROM Win32_BIOS"
$bios.Get()
SMBIOSBIOSVersion : S03KT39A
Manufacturer : LENOVO
Name : S03KT39A
SerialNumber : MJ0AETTX
Version : LENOVO - 1270
Při použití akcelerátoru [wmisearcher]
typů změní řetězec dotazu na objekt ManagementObjectSearcher , jak je znázorněno v následujících příkazech.
$a = "SELECT * FROM Win32_BIOS"
$a.GetType().FullName
System.String
$a = [wmisearcher]"SELECT * FROM Win32_BIOS"
$a.GetType().FullName
System.Management.ManagementObjectSearcher
Tento formát příkazu funguje na jakémkoli dotazu. Následující příkaz získá hodnotu vlastnosti Name třídy Win32_BIOS WMI.
$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 :
Použití základního příkazu WQL WHERE
Příkaz WHERE
vytvoří podmínky pro data, která SELECT
příkaz vrátí.
Příkaz WHERE
má následující formát:
WHERE <property> <operator> <value>
Příklad:
WHERE Name = 'Notepad.exe'
Příkaz WHERE
se používá s příkazem SELECT
, jak je znázorněno v následujícím příkladu.
SELECT * FROM Win32_Process WHERE Name = 'Notepad.exe'
Při použití WHERE
příkazu musí být název a hodnota vlastnosti přesné.
Například následující příkaz načte procesy Poznámkového bloku v místním počítači.
Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad.exe'"
Následující příkaz však selže, protože název procesu obsahuje příponu .exe
souboru.
Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE name='Notepad'"
Operátory porovnání příkazů WHERE
Následující operátory jsou platné v příkazu 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
Existují i jiné operátory, ale ty se používají k porovnání.
Například následující dotaz vybere vlastnosti Name and Priority z procesů ve třídě Win32_Process , kde je priorita procesu větší nebo rovna 11. Rutina Get-WmiObject
spustí dotaz.
$highPriority = "Select Name, Priority from Win32_Process " +
"WHERE Priority >= 11"
Get-WmiObject -Query $highPriority
Použití operátorů WQL v parametru -Filter
Operátory jazyka WQL lze použít také v hodnotě parametru Filter rutin Get-WmiObject
nebo Get-CimInstance
rutin a také v hodnotě parametrů dotazu těchto rutin.
Například následující příkaz získá Name a ProcessId vlastnosti posledních pěti procesů, které mají ProcessId hodnoty větší než 1004. Příkaz pomocí parametru Filter určuje podmínku 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
pomocí operátoru LIKE
Operátor LIKE
umožňuje použít zástupné znaky k filtrování výsledků dotazu 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
Pokud se operátor použije bez zástupných znaků nebo operátorů rozsahu, chová se jako operátor rovnosti (=
) a vrací objekty pouze v případě, že jsou přesně shodné se vzorem.
Operaci rozsahu můžete kombinovat se zástupným znakem procenta (%
) a vytvořit tak jednoduché, ale výkonné filtry.
Příklady operátorů LIKE
Příklad 1: [<range>]
Následující příkazy spustí Poznámkový blok a pak vyhledá instanci třídy Win32_Process , která má název začínající písmenem mezi písmenem "H" a "N" (nerozlišuje velká a malá písmena).
Dotaz by měl vrátit jakýkoli proces od 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
Příklad 2: [<rozsah>] a %
Následující příkazy vyberou všechny procesy, které mají název začínající písmenem mezi písmeny A a P (nerozlišují malá a velká písmena), za kterými následuje nula nebo více písmen v libovolné kombinaci.
Rutina Get-WmiObject
spustí dotaz, rutina Select-Object
získá vlastnosti Name a Process Id a Sort-Object
rutina seřadí výsledky podle abecedy podle názvu.
$query = "SELECT * FROM Win32_Process WHERE name LIKE '[A-P]%'"
Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessId |
Sort-Object -Property Name
Příklad 3: Není v rozsahu (^)
Následující příkaz získá procesy, jejichž názvy nezačínají žádným z následujících písmen: A, S, W, P, R, C, U, N
a následuje nula nebo více písmen.
$query = "SELECT * FROM Win32_Process WHERE name LIKE '[^ASWPRCUN]%'"
Get-WmiObject -Query $query |
Select-Object -Property Name, ProcessId |
Sort-Object -Property Name
Příklad 4: Všechny znaky – nebo žádné (%)
Následující příkazy získají procesy, které mají názvy začínající calc
.
Symbol procenta (%
) je zástupný znak WQL. Je to ekvivalent zástupné dokumentace hvězdičky (*
) v PowerShellu.
$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'calc%'"
Get-WmiObject -Query $query | Select-Object -Property Name, ProcessId
Name ProcessId
---- ---------
calc.exe 4424
Příklad 5: Jeden znak (_)
Následující příkazy získají procesy s názvy, které mají následující vzor, c_lc.exe
kde znak podtržítka představuje libovolný jeden znak. Tento vzor odpovídá jakémukoli názvu, od calc.exe
kterého czlc.exe
se používá znak , nebo c9lc.exe
, ale neodpovídá názvům, ve kterých jsou "c" a "l" odděleny více než jedním znakem.
$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
Příklad 6: Přesná shoda
Následující příkazy získají procesy s názvem WLIDSVC.exe
. I když dotaz používá LIKE
klíčové slovo, vyžaduje přesnou shodu, protože hodnota neobsahuje žádné zástupné znaky.
$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
Použití operátoru OR
Pokud chcete zadat více nezávislých podmínek, použijte OR
klíčové slovo. Klíčové OR
slovo se zobrazí v klauzuli WHERE
. Provede inkluzivní OR
operaci se dvěma (nebo více) podmínkami a vrátí položky, které splňují některou z podmínek.
Operátor OR
má následující formát:
WHERE <property> <operator> <value> OR <property> <operator> <value> ...
Například následující příkazy získají všechny instance Win32_Process třídy WMI, ale vrátí je pouze v případě, že název procesu je winword.exe
nebo excel.exe
.
$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
" OR Name='excel.exe'"
Get-WmiObject -Query $q
Příkaz OR
lze použít s více než dvěma podmínkami. V následujícím dotazu příkaz OR
získá Winword.exe
, Excel.exe
nebo powershell.exe
.
$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
" OR Name='excel.exe' OR Name='powershell.exe'"
Použití operátoru AND
Pokud chcete zadat více souvisejících podmínek, použijte AND
klíčové slovo. Klíčové AND
slovo se zobrazí v klauzuli WHERE
. Vrátí položky, které splňují všechny podmínky.
Operátor AND
má následující formát:
WHERE <property> <operator> <value> `AND` <property> <operator> <value> ...
Například následující příkazy získají procesy, které mají název Winword.exe
a ID procesu 6512.
Všimněte si, že příkazy používají tuto rutinu 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
Všechny operátory, včetně LIKE
operátorů, jsou platné s operátory a OR
operátoryAND
. Operátory a OR
operátory můžete zkombinovat AND
v jednom dotazu s závorky, které říkají rozhraní WMI, které klauzule se mají zpracovat jako první.
Tento příkaz používá znak pokračování windows PowerShellu (`
) rozdělí příkaz na dva řádky.
Hledání hodnot null
Hledání hodnot null ve službě WMI je náročné, protože může vést k nepředvídatelným výsledkům.
Null
není nula a není ekvivalentní prázdnému řetězci. Některé vlastnosti třídy WMI jsou inicializovány a jiné nejsou, takže hledání null nemusí fungovat pro všechny vlastnosti.
Chcete-li vyhledat hodnoty null, použijte operátor Is s hodnotou null
.
Například následující příkazy získají procesy, které mají hodnotu null pro IntallDate vlastnost. Příkazy vrací mnoho procesů.
$q = "SELECT * FROM Win32_Process WHERE InstallDate is null"
Get-WmiObject -Query $q
Naproti tomu následující příkaz získá uživatelské účty, které mají hodnotu null pro vlastnost Description . Tento příkaz nevrací žádné uživatelské účty, i když většina uživatelských účtů nemá pro vlastnost Popis žádnou hodnotu.
$q = "SELECT * FROM Win32_UserAccount WHERE Description is null"
Get-WmiObject -Query $q
Pokud chcete najít uživatelské účty, které nemají žádnou hodnotu pro vlastnost Popis , použijte operátor rovnosti k získání prázdného řetězce. K vyjádření prázdného řetězce použijte dvě po sobě jdoucí jednoduché uvozovky.
$q = "SELECT * FROM Win32_UserAccount WHERE Description = '' "
Použití hodnoty true nebo false
Chcete-li získat logické hodnoty ve vlastnostech objektů WMI, použijte True
a False
.
Nerozlišují malá a velká písmena.
Následující dotaz WQL vrátí pouze místní uživatelské účty z počítače připojeného k doméně.
$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = True"
Get-CimInstance -Query $q
Pokud chcete najít účty domény, použijte hodnotu False, jak je znázorněno v následujícím příkladu.
$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = False"
Get-CimInstance -Query $q
Použití řídicího znaku
Jazyk WQL používá zpětné lomítko (\
) jako řídicí znak. To se liší od Windows PowerShellu, který používá znak zpětného znaménka (`
).
Uvozovky a znaky používané pro uvozovky často musí být uvozovky uvozovky, aby se neinterpretovaly chybně.
Pokud chcete najít uživatele, jehož jméno obsahuje jednoduchou uvozovku, použijte zpětné lomítko k uvozovce, jak je znázorněno v následujícím příkazu.
$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
V některých případech musí být zpětné lomítko také uchvácené. Například následující příkazy generují chybu neplatného dotazu kvůli zpětnému lomítku v hodnotě Titulek.
$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
Pokud chcete zpětné lomítko utéct, použijte druhý znak zpětného lomítka, jak je znázorněno v následujícím příkazu.
$q = "SELECT * FROM Win32_UserAccount WHERE Caption = 'Fabrikam\\TimO'"
Get-CimInstance -Query $q