Sdílet prostřednictvím


about_WQL

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, WHEREa 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ů:

  1. Přetypujte řetězec WQL do objektu ManagementObjectSearcher .
  2. 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.exese 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.exenebo 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

Viz také