Aracılığıyla paylaş


about_WQL

Kısa açıklama

PowerShell'de WMI nesnelerini almak için kullanılabilecek WMI Sorgu Dili'ni (WQL) açıklar.

Uzun açıklama

WQL, WMI'dan bilgi almak için kullanılan Windows Yönetim Araçları (WMI) sorgu dilidir.

PowerShell'de WMI sorgusu gerçekleştirmek için WQL kullanmanız gerekmez. Bunun yerine CIM cmdlet'lerinin parametrelerini kullanabilirsiniz. WQL sorguları standart CIM komutlarından biraz daha hızlıdır ve komutlar yüzlerce sistemde çalıştırıldığında iyileştirilmiş performans ortaya çıkar. Ancak başarılı bir WQL sorgusu yazmak için harcadığınız sürenin performans artışından daha fazla olmadığından emin olun.

WQL'yi kullanmak için ihtiyacınız olan temel WQL deyimleri, SELECTve WHEREdeyimleridirFROM.

WQL ne zaman kullanılır?

WMI ve özellikle WQL ile çalışırken PowerShell de kullandığınızı unutmayın. WQL sorgusu genellikle beklendiği gibi çalışmazsa standart bir PowerShell komutunu kullanmak WQL sorgusunda hata ayıklamaktan daha kolaydır.

Sorgunuz çok büyük miktarda veri döndürmediği sürece, aynı şeyi yerine getiren kabul edilebilir bir PowerShell cmdlet'i olduğunda karmaşık bir WQL sorgusunu mükemmel hale getirmeye çalışmak için saatler harcamak nadiren verimli olur.

SELECT deyimini kullanma

Tipik bir WMI sorgusu, bir SELECT WMI sınıfının tüm özelliklerini veya belirli özelliklerini alan bir deyimle başlar. WMI sınıfının tüm özelliklerini seçmek için yıldız işareti ()* kullanın. FROM anahtar sözcüğü WMI sınıfını belirtir.

Deyim SELECT aşağıdaki biçime sahiptir:

SELECT <property> FROM <WMI-class>

Örneğin, aşağıdaki SELECT deyimi * WMI sınıfının örneklerinden tüm özellikleri () seçer.

SELECT * FROM Win32_BIOS

Uyarı

PowerShell yalnızca varsayılan nesne özelliklerini görüntüler. Bu özellikler dosyasında tanımlanır Types.ps1xml . Select-Object Ek özellikleri görüntülemek için cmdlet'ini veya Format-* cmdlet'ini kullanın.

WMI sınıfının belirli bir özelliğini seçmek için özellik adını ve SELECT anahtar sözcükleri arasına FROM yerleştirin.

Aşağıdaki sorgu, Win32_BIOS WMI sınıfından yalnızca BIOS'un adını seçer. komutu sorguyu değişkene $queryName kaydeder.

SELECT Name FROM Win32_BIOS

Birden fazla özellik seçmek için, özellik adlarını ayırmak için virgül kullanın. Aşağıdaki WMI sorgusu, Win32_BIOS WMI sınıfının adını ve sürümünü seçer. komutu sorguyu değişkene $queryNameVersion kaydeder.

SELECT name, version FROM Win32_BIOS

WQL sorgusunu kullanma

PowerShell komutunda WQL sorgusunu kullanmanın iki yolu vardır.

  • CIM cmdlet'lerini kullanma
  • Tür hızlandırıcısını [wmisearcher] kullanma

Get-CimInstance cmdlet'ini kullanma

Get-CimInstance WMI sınıfları da dahil olmak üzere CIM uyumlu sınıfların örneklerini alır. PowerShell 3.0'ı kullanıma sunulan CIM cmdlet'leri WMI cmdlet'leriyle aynı görevleri gerçekleştirir. CIM cmdlet'leri WS-Management (WSMan) standartlarına ve cmdlet'lerin diğer işletim sistemlerini çalıştıran Windows bilgisayarlarını ve bilgisayarlarını yönetmek için aynı teknikleri kullanmasına olanak tanıyan Ortak Bilgi Modeli (CIM) standardıyla uyumludur.

Aşağıdaki komut bir WQL sorgusu çalıştırmak için cmdlet'ini kullanır Get-CimInstance .

ile Get-WmiObject kullanılabilen tüm WQL sorguları ile Get-CimInstancede kullanılabilir.

Get-CimInstance -Query "SELECT * FROM Win32_BIOS"
SMBIOSBIOSVersion : S03KT39A
Manufacturer      : LENOVO
Name              : S03KT39A
SerialNumber      : MJ0AETTX
Version           : LENOVO - 1270

Get-CimInstance, döndüren ManagementObject yerine bir CimInstance nesnesi döndürür, Get-WmiObject ancak nesneler oldukça benzerdir.

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

Tür hızlandırıcısını [wmisearcher] kullanma

Tür hızlandırıcısı [wmisearcher] bir WQL deyim dizesinden bir ManagementObjectSearcher nesnesi oluşturur. ManagementObjectSearcher nesnesinin birçok özelliği ve yöntemi vardır, ancak en temel yöntem, belirtilen WMI sorgusunu çağıran ve sonuçta elde edilen nesneleri döndüren Get yöntemidir.

kullanarak [wmisearcher]ManagementObjectSearcher .NET sınıfına kolay erişim elde edebilirsiniz. Bu, WMI'yi sorgulamanıza ve sorgunun yürütülürken nasıl yapılandırılacağını yapılandırmanıza olanak tanır.

Tür hızlandırıcısını [wmisearcher] kullanmak için:

  1. WQL dizesini bir ManagementObjectSearcher nesnesine dönüştür.
  2. ManagementObjectSearcher nesnesinin Get yöntemini çağırın.

Örneğin, aşağıdaki komut "tümünü seç" sorgusunu yayınlar, sonucu $bios değişkene kaydeder ve ardından değişkende ManagementObjectSearcher nesnesinin Get() yöntemini çağırır$bios.

$bios = [wmisearcher]"SELECT * FROM Win32_BIOS"
$bios.Get()
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

Sorguyu [wmisearcher] veya değişkeni değiştirmek için tür hızlandırıcısını kullanabilirsiniz. Aşağıdaki örnekte, değişkenini [wmisearcher] değiştirmek için tür hızlandırıcısı kullanılır. Sonuç aynıdır.

[wmisearcher]$bios = "SELECT * FROM Win32_BIOS"
$bios.Get()
SMBIOSBIOSVersion : S03KT39A
Manufacturer      : LENOVO
Name              : S03KT39A
SerialNumber      : MJ0AETTX
Version           : LENOVO - 1270

Tür hızlandırıcısını [wmisearcher] kullandığınızda, aşağıdaki komutlarda gösterildiği gibi sorgu dizesini bir ManagementObjectSearcher nesnesine dönüştürür.

$a = "SELECT * FROM Win32_BIOS"
$a.GetType().FullName
System.String

$a = [wmisearcher]"SELECT * FROM Win32_BIOS"
$a.GetType().FullName
System.Management.ManagementObjectSearcher

Bu komut biçimi tüm sorgularda çalışır. Aşağıdaki komut, Win32_BIOS WMI sınıfının Name özelliğinin değerini alır.

$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   :

Temel WQL WHERE deyimini kullanma

Deyimi WHERE , bir SELECT deyiminin döndürdüğü veriler için koşullar oluşturur.

deyimi WHERE aşağıdaki biçime sahiptir:

WHERE <property> <operator> <value>

Örneğin:

WHERE Name = 'Notepad.exe'

deyimi WHERE , aşağıdaki örnekte gösterildiği gibi deyimiyle SELECT birlikte kullanılır.

SELECT * FROM Win32_Process WHERE Name = 'Notepad.exe'

deyimi kullanılırken WHERE özellik adı ve değeri doğru olmalıdır.

Örneğin, aşağıdaki komut yerel bilgisayardaki Not Defteri işlemlerini alır.

Get-CimInstance -Query "SELECT * FROM Win32_Process WHERE name='Notepad.exe'"

Ancak, işlem adı dosya uzantısını içerdiğinden .exe aşağıdaki komut başarısız olur.

Get-CimInstance -Query "SELECT * FROM Win32_Process WHERE name='Notepad'"

WHERE deyimi karşılaştırma işleçleri

Aşağıdaki işleçler bir WQL WHERE deyiminde geçerlidir.

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

Başka işleçler de vardır, ancak bunlar karşılaştırma yapmak için kullanılanlardır.

Örneğin, aşağıdaki sorgu, Win32_Process sınıfında işlem önceliğinin 11'den büyük veya buna eşit olduğu işlemlerden Ad ve Öncelik özelliklerini seçer. Get-WmiObject Cmdlet sorguyu çalıştırır.

$highPriority = "Select Name, Priority from Win32_Process " +
  "WHERE Priority >= 11"
Get-CimInstance -Query $highPriority

-Filter parametresinde WQL işleçlerini kullanma

WQL işleçleri, cmdlet'in Filter parametresinin Get-CimInstance değerinde ve bu cmdlet'lerin Sorgu parametrelerinin değerinde de kullanılabilir.

Örneğin, aşağıdaki komut 1004'ten büyük ProcessId değerlerine sahip son beş işlemin Adı ve ProcessId özelliklerini alır. komut, ProcessId koşulunu belirtmek için Filter parametresini kullanır.

$getCimInstance = @{
    Class = 'Win32_Process'
    Property = 'Name', 'ProcessId'
    Filter = "ProcessId >= 1004"
}
Get-CimInstance @getCimInstance |
    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 işlecini kullanma

işleci, LIKE WQL sorgusunun sonuçlarını filtrelemek için joker karakterler kullanmanıza olanak tanır.

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 İşleç joker karakter veya aralık işleçleri olmadan kullanıldığında, eşitlik işleci (=) gibi davranır ve nesneleri yalnızca desen için tam eşleşme olduğunda döndürür.

Basit ama güçlü filtreler oluşturmak için aralık işlemini yüzde (%) joker karakteriyle birleştirebilirsiniz.

LIKE işleci örnekleri

Örnek 1: [<aralık>]

Aşağıdaki komutlar Not Defteri'ni başlatır ve ardından "H" ile "N" (büyük/küçük harfe duyarsız) arasında bir harfle başlayan bir ada sahip Win32_Process sınıfı örneğini arar.

Sorgu, içinden Hotepad.exeNotepad.exeherhangi bir işlem döndürmelidir.

Notepad   # Starts Notepad
$query = "SELECT * FROM Win32_Process WHERE Name LIKE '[H-N]otepad.exe'"
Get-CimInstance -Query $query | select Name, ProcessId
Name                                ProcessId
----                                ---------
notepad.exe                              1740

Örnek 2: [<aralık>] ve %

Aşağıdaki komutlar, A ile P (büyük/küçük harfe duyarsız) arasında bir harfle başlayan ve ardından herhangi bir birleşimde sıfır veya daha fazla harf içeren tüm işlemleri seçer.

Get-CimInstance cmdlet sorguyu çalıştırır, Select-Object cmdlet Adı ve ProcessId özelliklerini alır ve Sort-Object cmdlet sonuçları ada göre alfabetik düzende sıralar.

$query = "SELECT * FROM Win32_Process WHERE name LIKE '[A-P]%'"
Get-CimInstance -Query $query |
    Select-Object -Property Name, ProcessId |
    Sort-Object -Property Name

Örnek 3: Aralıkta Değil (^)

Aşağıdaki komut, adları şu harflerden herhangi biriyle başlamayan işlemleri alır: A, S, W, P, R, C, U, N

ve sıfır veya daha fazla harfi takip etti.

$query = "SELECT * FROM Win32_Process WHERE name LIKE '[^ASWPRCUN]%'"
Get-CimInstance -Query $query |
    Select-Object -Property Name, ProcessId |
    Sort-Object -Property Name

Örnek 4: Herhangi bir karakter -- veya hiçbiri (%)

Aşağıdaki komutlar ile calcbaşlayan adlara sahip işlemleri alır. Yüzde simgesi (%), WQL joker karakteridir. PowerShell'deki yıldız işareti (*) joker karakterine eşdeğerdir.

$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'calc%'"
Get-CimInstance -Query $query | Select-Object -Property Name, ProcessId
Name                               ProcessId
----                               ---------
calc.exe                                4424

Örnek 5: Bir karakter (_)

Aşağıdaki komutlar, c_lc.exe alt çizgi karakterinin herhangi bir karakteri temsil ettiği aşağıdaki desene sahip adlara sahip işlemleri alır. Bu düzen , veya calc.exearacılığıyla herhangi czlc.exe bir adla c9lc.exeeşleşir, ancak "c" ve "l" arasında birden fazla karakter bulunan adlarla eşleşmiyor.

$query = "SELECT * FROM Win32_Process WHERE Name LIKE 'c_lc.exe'"
Get-CimInstance -Query $query | Select-Object -Property Name, ProcessId
Name                                 ProcessId
----                                 ---------
calc.exe                                  4424

Örnek 6: Tam eşleşme

Aşağıdaki komutlar adlı WLIDSVC.exeişlemleri alır. Sorgu anahtar sözcüğünü LIKE kullansa da, değer joker karakter içermediğinden tam eşleşme gerektirir.

$query = "SELECT * FROM Win32_Process WHERE name LIKE 'WLIDSVC.exe'"
Get-CimInstance -Query $query | Select-Object -Property Name, ProcessId
Name                                 ProcessId
----                                 ---------
WLIDSVC.exe                                84

OR işlecini kullanma

Birden çok bağımsız koşul belirtmek için anahtar sözcüğünü OR kullanın. anahtar OR sözcüğü yan tümcesinde WHERE görünür. İki (veya daha fazla) koşulda kapsayıcı OR bir işlem gerçekleştirir ve koşullardan herhangi birini karşılayan öğeleri döndürür.

işleci OR aşağıdaki biçime sahiptir:

WHERE <property> <operator> <value> OR <property> <operator> <value> ...

Örneğin, aşağıdaki komutlar Win32_Process WMI sınıfının tüm örneklerini alır ancak yalnızca işlem adı winword.exe veya excel.exeolduğunda döndürür.

$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
  " OR Name='excel.exe'"
Get-CimInstance -Query $q

deyimi OR ikiden fazla koşulla kullanılabilir. Aşağıdaki sorguda OR deyimi , Winword.exeveya Excel.exealırpowershell.exe.

$q = "SELECT * FROM Win32_Process WHERE Name='winword.exe'" +
  " OR Name='excel.exe' OR Name='powershell.exe'"

AND işlecini kullanma

Birden çok ilgili koşul belirtmek için anahtar sözcüğünü AND kullanın. anahtar AND sözcüğü yan tümcesinde WHERE görünür. Tüm koşulları karşılayan öğeleri döndürür.

işleci AND aşağıdaki biçime sahiptir:

WHERE <property> <operator> <value> `AND` <property> <operator> <value> ...

Örneğin, aşağıdaki komutlar adı Winword.exe ve işlem kimliği 6512 olan işlemleri alır.

Komutların cmdlet'ini Get-CimInstance kullandığını unutmayın.

$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

İşleçler de dahil olmak üzere LIKE tüm işleçler ve OR işleçleriyle AND geçerlidir. Ayrıca, ve OR işleçlerini tek bir sorguda wmi'ya önce hangi yan tümcelerin işlendiğini belirten parantezlerle birleştirebilirsinizAND.

Bu komut, komutu iki satıra bölen PowerShell devamlılık karakterini (`) kullanır.

Null değerler aranıyor

WMI'da null değerleri aramak zordur, çünkü tahmin edilemeyen sonuçlara yol açabilir. Null sıfır değildir ve boş bir dizeye eşdeğer değildir. Bazı WMI sınıfı özellikleri başlatılırken diğerleri başlatılmaz, bu nedenle null araması tüm özellikler için çalışmayabilir.

Null değerleri aramak için is işlecini değeriyle nullkullanın.

Örneğin, aşağıdaki komutlar InstallDate özelliği için null değere sahip işlemleri alır. Komutlar birçok işlem döndürür.

$q = "SELECT * FROM Win32_Process WHERE InstallDate is null"
Get-CimInstance -Query $q

Buna karşılık, aşağıdaki komut Description özelliği için null değere sahip kullanıcı hesaplarını alır. Çoğu kullanıcı hesabının Description özelliği için herhangi bir değeri olmasa bile bu komut hiçbir kullanıcı hesabı döndürmez.

$q = "SELECT * FROM Win32_UserAccount WHERE Description is null"
Get-CimInstance -Query $q

Description özelliği için değeri olmayan kullanıcı hesaplarını bulmak için eşitlik işlecini kullanarak boş bir dize alın. Boş dizeyi temsil etmek için ardışık iki tek tırnak işareti kullanın.

$q = "SELECT * FROM Win32_UserAccount WHERE Description = '' "

True veya false kullanma

WMI nesnelerinin özelliklerinde boole değerleri almak için ve TruekullanınFalse. Büyük/küçük harfe duyarlı değiller.

Aşağıdaki WQL sorgusu yalnızca etki alanına katılmış bir bilgisayardan yerel kullanıcı hesaplarını döndürür.

$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = True"
Get-CimInstance -Query $q

Etki alanı hesaplarını bulmak için aşağıdaki örnekte gösterildiği gibi False değerini kullanın.

$q = "SELECT * FROM Win32_UserAccount WHERE LocalAccount = False"
Get-CimInstance -Query $q

Kaçış karakterini kullanma

WQL, kaçış karakteri olarak ters eğik çizgiyi (\) kullanır. Bu, backtick karakterini (`) kullanan PowerShell'den farklıdır.

Tırnak işaretleri ve tırnak işaretleri için kullanılan karakterlerin yanlış anlaşılmaması için genellikle kaçış karakteri gerekir.

Adında tek tırnak işareti bulunan bir kullanıcıyı bulmak için, aşağıdaki komutta gösterildiği gibi tek tırnak işaretinden kaçmak için ters eğik çizgi kullanın.

$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

Bazı durumlarda ters eğik çizginin de kaçması gerekir. Örneğin, aşağıdaki komutlar Caption değerinde ters eğik çizgi nedeniyle Geçersiz Sorgu hatası oluşturur.

$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

Ters eğik çizgiden kurtulmak için aşağıdaki komutta gösterildiği gibi ikinci bir ters eğik çizgi karakteri kullanın.

$q = "SELECT * FROM Win32_UserAccount WHERE Caption = 'Fabrikam\\TimO'"
Get-CimInstance -Query $q

Ayrıca bakınız