Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- WQL dizesini bir ManagementObjectSearcher nesnesine dönüştür.
- 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
PowerShell