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
, , WHERE
dan 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-CimInstance
mengembalikan 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:
- Transmisikan string WQL ke dalam objek ManagementObjectSearcher .
- 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.exe
atau 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