about_WQL

Deskripsi singkat

Menjelaskan WMI Query Language (WQL), yang dapat digunakan untuk mendapatkan objek WMI di Windows PowerShell.

Deskripsi panjang

WQL adalah bahasa kueri Windows Management Instrumentation (WMI), yang merupakan bahasa yang digunakan untuk mendapatkan informasi dari WMI.

Anda tidak diharuskan menggunakan WQL untuk melakukan kueri WMI di Windows PowerShell. Sebagai gantinya, Anda dapat menggunakan parameter Get-WmiObject cmdlet atau Get-CimInstance . Kueri WQL agak lebih cepat daripada perintah standar Get-WmiObject dan performa yang ditingkatkan terbukti ketika perintah berjalan pada ratusan sistem. Namun, pastikan bahwa waktu yang Anda habiskan untuk menulis kueri WQL yang berhasil tidak melebihi peningkatan performa.

Pernyataan WQL dasar yang perlu Anda gunakan WQL adalah SELECT, , WHEREdan FROM.

Kapan menggunakan WQL

Saat bekerja dengan WMI, dan terutama dengan WQL, jangan lupa bahwa Anda juga menggunakan Windows PowerShell. Seringkali, jika kueri WQL tidak berfungsi seperti yang diharapkan, lebih mudah untuk menggunakan perintah Windows PowerShell standar daripada men-debug kueri WQL.

Kecuali Anda mengembalikan sejumlah besar data dari seluruh sistem jarak jauh yang dibatasi bandwidth, jarang produktif untuk menghabiskan berjam-jam mencoba menyempurnakan kueri WQL yang rumit ketika ada cmdlet PowerShell yang dapat diterima yang melakukan hal yang sama.

Menggunakan pernyataan SELECT

Kueri WMI umum dimulai dengan SELECT pernyataan yang mendapatkan semua properti atau properti tertentu dari kelas WMI. Untuk memilih semua properti kelas WMI, gunakan tanda bintang (*). Kata FROM kunci menentukan kelas WMI.

Pernyataan SELECT memiliki format berikut:

SELECT <property> FROM <WMI-class>

Misalnya, pernyataan berikut SELECT memilih semua properti (*) dari instans kelas WMI Win32_Bios .

SELECT * FROM Win32_Bios

Catatan

PowerShell hanya menampilkan properti objek default. Properti ini didefinisikan dalam Types.ps1xml file. Select-Object Gunakan cmdlet atau Format-* cmdlet untuk menampilkan properti tambahan.

Untuk memilih properti tertentu dari kelas WMI, tempatkan nama properti di antara SELECT kata kunci dan FROM .

Kueri berikut hanya memilih nama BIOS dari kelas WMI Win32_Bios . Perintah menyimpan kueri dalam $queryName variabel.

SELECT Name FROM Win32_Bios

Untuk memilih lebih dari satu properti, gunakan koma untuk memisahkan nama properti. Kueri WMI berikut memilih nama dan versi kelas WMI Win32_Bios . Perintah menyimpan kueri dalam $queryNameVersion variabel.

SELECT name, version FROM Win32_Bios

Menggunakan kueri WQL

Ada tiga cara untuk menggunakan kueri WQL di perintah Windows PowerShell.

  • Menggunakan cmdlet Get-WmiObject
  • Menggunakan cmdlet Get-CimInstance
  • [wmisearcher] Gunakan akselerator jenis.

Menggunakan cmdlet Get-WmiObject

Cara paling mendasar untuk menggunakan kueri WQL adalah dengan mengapitnya dalam tanda kutip (sebagai string) lalu menggunakan string kueri sebagai nilai parameter Get-WmiObject Kueri cmdlet, seperti yang diperlihatkan dalam contoh berikut.

Get-WmiObject -Query "SELECT * FROM Win32_Bios"
SMBIOSBIOSVersion : 8BET56WW (1.36 )
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R9FPY3P
Version           : LENOVO - 1360

Anda juga dapat menyimpan pernyataan WQL dalam variabel lalu menggunakan variabel sebagai nilai parameter Kueri , seperti yang diperlihatkan dalam perintah berikut.

$query = "SELECT * FROM Win32_Bios"
Get-WmiObject -Query $query

Anda dapat menggunakan salah satu format dengan pernyataan WQL apa pun. Perintah berikut menggunakan kueri dalam $queryName variabel untuk hanya mendapatkan properti Nama dan Versi dari BIOS sistem.

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

Ingatlah bahwa Anda dapat menggunakan parameter Get-WmiObject cmdlet untuk mendapatkan hasil yang sama. Misalnya, perintah berikut juga mendapatkan nilai properti Nama dan Versi instans kelas WMI Win32_Bios .

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   :

Menggunakan cmdlet Get-CimInstance

Dimulai di Windows PowerShell 3.0, Anda dapat menggunakan Get-CimInstance cmdlet untuk menjalankan kueri WQL.

Get-CimInstance mendapatkan instans kelas yang mematuhi CIM, termasuk kelas WMI. Cmdlet CIM, memperkenalkan Windows PowerShell 3.0, melakukan tugas yang sama dengan cmdlet WMI. Cmdlet CIM mematuhi standar WS-Management (WSMan) dan dengan standar Common Information Model (CIM), yang memungkinkan cmdlet menggunakan teknik yang sama untuk mengelola komputer dan komputer Windows yang menjalankan sistem operasi lainnya.

Perintah berikut menggunakan Get-CimInstance cmdlet untuk menjalankan kueri WQL.

Kueri WQL apa pun yang dapat digunakan dengan Get-WmiObject juga dapat digunakan dengan Get-CimInstance.

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

Get-CimInstancemengembalikan objek CimInstance, alih-alih ManagementObject yang Get-WmiObject mengembalikan, tetapi objeknya cukup mirip.

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

Menggunakan akselerator jenis wmisearcher

Akselerator [wmisearcher] jenis membuat objek ManagementObjectSearcher dari string pernyataan WQL. Objek ManagementObjectSearcher memiliki banyak properti dan metode, tetapi metode paling dasar adalah metode Get, yang memanggil kueri WMI yang ditentukan dan mengembalikan objek yang dihasilkan.

Menggunakan [wmisearcher], Anda mendapatkan akses mudah ke kelas ManagementObjectSearcher .NET. Ini memungkinkan Anda mengkueri WMI dan mengonfigurasi cara kueri dilakukan.

Untuk menggunakan [wmisearcher] akselerator jenis:

  1. Transmisikan string WQL ke dalam objek ManagementObjectSearcher .
  2. Panggil metode Dapatkan objek ManagementObjectSearcher .

Misalnya, perintah berikut mentransmisikan kueri "pilih semua", menyimpan hasilnya dalam $bios variabel, lalu memanggil Get() metode objek ManagementObjectSearcher dalam $bios variabel.

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

Anda dapat menggunakan [wmisearcher] akselerator jenis untuk mentransmisian kueri atau variabel. Dalam contoh berikut, [wmisearcher] akselerator jenis digunakan untuk melemparkan variabel. Hasilnya sama.

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

Saat Anda menggunakan [wmisearcher] akselerator jenis, itu mengubah string kueri menjadi objek ManagementObjectSearcher , seperti yang diperlihatkan dalam perintah berikut.

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

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

Format perintah ini berfungsi pada kueri apa pun. Perintah berikut mendapatkan nilai properti Nama dari kelas WMI Win32_Bios .

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

Menggunakan pernyataan DASAR WQL WHERE

Pernyataan WHERE menetapkan kondisi untuk data yang dikembalikan oleh SELECT pernyataan.

Pernyataan WHERE memiliki format berikut:

WHERE <property> <operator> <value>

Contohnya:

WHERE Name = 'Notepad.exe'

Pernyataan WHERE digunakan dengan pernyataan , seperti yang SELECT ditunjukkan dalam contoh berikut.

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

Saat menggunakan WHERE pernyataan, nama dan nilai properti harus akurat.

Misalnya, perintah berikut mendapatkan proses Notepad di komputer lokal.

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

Namun, perintah berikut gagal, karena nama proses menyertakan .exe ekstensi file.

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

Operator perbandingan pernyataan WHERE

Operator berikut valid dalam pernyataan 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

Ada operator lain, tetapi ini adalah operator yang digunakan untuk membuat perbandingan.

Misalnya, kueri berikut memilih properti Nama dan Prioritas dari proses di kelas Win32_Process di mana prioritas proses lebih besar dari atau sama dengan 11. Get-WmiObject Cmdlet menjalankan kueri.

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

Menggunakan operator WQL dalam parameter -Filter

Operator WQL juga dapat digunakan dalam nilai parameter Filter cmdlet Get-WmiObject atau Get-CimInstance , serta dalam nilai parameter Kueri dari cmdlet ini.

Misalnya, perintah berikut mendapatkan properti Nama dan ProcessID dari lima proses terakhir yang memiliki nilai ProcessID lebih besar dari 1004. Perintah menggunakan parameter Filter untuk menentukan kondisi 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

menggunakan operator LIKE

Operator LIKE memungkinkan Anda menggunakan karakter kartubebas untuk memfilter hasil kueri 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 Saat operator digunakan tanpa karakter kartubebas atau operator rentang, operator tersebut berprilaku seperti operator kesetaraan (=) dan mengembalikan objek hanya ketika mereka sama persis dengan pola.

Anda dapat menggabungkan operasi rentang dengan karakter wildcard persen (%) untuk membuat filter sederhana namun kuat.

Contoh operator LIKE

Contoh 1: [<rentang>]

Perintah berikut memulai Notepad lalu mencari instans kelas Win32_Process yang memiliki nama yang dimulai dengan huruf antara "H" dan "N" (tidak peka huruf besar/kecil).

Kueri harus mengembalikan proses apa pun dari Hotepad.exe melalui 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

Contoh 2: [<rentang>] dan %

Perintah berikut memilih semua proses yang memiliki nama yang dimulai dengan huruf antara A dan P (tidak peka huruf besar/kecil) diikuti dengan nol atau lebih huruf dalam kombinasi apa pun.

Get-WmiObject Cmdlet menjalankan kueri, Select-Object cmdlet mendapatkan properti Nama dan ProcessID, dan Sort-Object cmdlet mengurutkan hasil dalam urutan alfabet berdasarkan nama.

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

Contoh 3: Tidak dalam Rentang (^)

Perintah berikut mendapatkan proses yang namanya tidak dimulai dengan salah satu huruf berikut: A, S, W, P, R, C, U, N

dan mengikuti nol atau lebih huruf.

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

Contoh 4: Karakter apa pun -- atau tidak ada (%)

Perintah berikut mendapatkan proses yang memiliki nama yang dimulai dengan calc. Simbol persen (%) adalah karakter kartubebas WQL. Ini setara dengan kartubebas tanda bintang (*) di PowerShell.

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

Contoh 5: Satu karakter (_)

Perintah berikut mendapatkan proses yang memiliki nama yang memiliki pola berikut, c_lc.exe di mana karakter garis bawah mewakili satu karakter. Pola ini cocok dengan nama apa pun dari calc.exe melalui czlc.exe, atau c9lc.exe, tetapi tidak cocok dengan nama di mana "c" dan "l" dipisahkan oleh lebih dari satu karakter.

$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

Contoh 6: Kecocokan persis

Perintah berikut mendapatkan proses bernama WLIDSVC.exe. Meskipun kueri menggunakan kata kunci, kueri memerlukan kecocokan LIKE yang tepat, karena nilainya tidak menyertakan karakter kartubebas apa pun.

$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

Menggunakan operator OR

Untuk menentukan beberapa kondisi independen, gunakan OR kata kunci. Kata OR kunci muncul dalam WHERE klausa. Ini melakukan operasi inklusif OR pada dua kondisi (atau lebih) dan mengembalikan item yang memenuhi salah satu kondisi.

Operator OR memiliki format berikut:

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

Misalnya, perintah berikut mendapatkan semua instans kelas WMI Win32_Process tetapi mengembalikannya hanya jika nama proses adalah winword.exe atau excel.exe.

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

Pernyataan dapat OR digunakan dengan lebih dari dua kondisi. Dalam kueri berikut, OR pernyataan mendapatkan Winword.exe, , Excel.exeatau Powershell.exe.

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

Menggunakan operator AND

Untuk menentukan beberapa kondisi terkait, gunakan AND kata kunci. Kata AND kunci muncul dalam WHERE klausa. Ini mengembalikan item yang memenuhi semua kondisi.

Operator AND memiliki format berikut:

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

Misalnya, perintah berikut mendapatkan proses yang memiliki nama Winword.exe dan ID proses 6512.

Perhatikan bahwa perintah menggunakan Get-CimInstance cmdlet.

$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

Semua operator, termasuk LIKE operator valid dengan OR operator dan AND . Dan, Anda dapat menggabungkan OR operator dan AND dalam satu kueri dengan tanda kurung yang memberi tahu WMI klausa mana yang akan diproses terlebih dahulu.

Perintah ini menggunakan karakter kelanjutan Windows PowerShell (`) membagi perintah menjadi dua baris.

Mencari nilai null

Mencari nilai null di WMI sangat menantang, karena dapat menyebabkan hasil yang tidak dapat diprediksi. Null bukan nol dan tidak setara dengan string kosong. Beberapa properti kelas WMI diinisialisasi dan yang lain tidak, sehingga pencarian null mungkin tidak berfungsi untuk semua properti.

Untuk mencari nilai null, gunakan operator Is dengan nilai null.

Misalnya, perintah berikut mendapatkan proses yang memiliki nilai null untuk properti IntallDate . Perintah mengembalikan banyak proses.

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

Sebaliknya, perintah berikut, mendapatkan akun pengguna yang memiliki nilai null untuk properti Deskripsi . Perintah ini tidak mengembalikan akun pengguna apa pun, meskipun sebagian besar akun pengguna tidak memiliki nilai apa pun untuk properti Deskripsi .

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

Untuk menemukan akun pengguna yang tidak memiliki nilai untuk properti Deskripsi , gunakan operator kesetaraan untuk mendapatkan string kosong. Untuk mewakili string kosong, gunakan dua tanda kutip tunggal berturut-turut.

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

Menggunakan true atau false

Untuk mendapatkan nilai boolean dalam properti objek WMI, gunakan True dan False. Mereka tidak peka huruf besar/kecil.

Kueri WQL berikut ini hanya mengembalikan akun pengguna lokal dari komputer yang bergabung dengan domain.

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

Untuk menemukan akun domain, gunakan nilai False, seperti yang diperlihatkan dalam contoh berikut.

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

Menggunakan karakter escape

WQL menggunakan garis miring terbalik (\) sebagai karakter escape-nya. Ini berbeda dari Windows PowerShell, yang menggunakan karakter backtick (`).

Tanda kutip, dan karakter yang digunakan untuk tanda kutip, sering kali perlu diloloskan sehingga tidak disalahartikan.

Untuk menemukan pengguna yang namanya menyertakan tanda kutip tunggal, gunakan garis miring terbalik untuk menghindari tanda kutip tunggal, seperti yang ditunjukkan dalam perintah berikut.

$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

Dalam beberapa kasus, garis miring terbalik juga perlu diloloskan. Misalnya, perintah berikut menghasilkan kesalahan Kueri Tidak Valid karena garis miring terbelakang dalam nilai Keterangan.

$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

Untuk menghindari garis miring terbalik, gunakan karakter garis miring terbalik kedua, seperti yang ditunjukkan pada perintah berikut.

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

Lihat juga