Memakai WMI Event Di PowerShell

Pada WMI, terdapat jenis class yang disebut sebagai event class. Class seperti ini dipakai untuk menandakan bahwa sesuatu telah terjadi. Contohnya adalah class seperti Win32_DeviceChangeEvent, Win32_VolumeChangeEvent, dan sebagainya. Pada artikel ini, saya akan membuat sebuah script PowerShell yang akan mengerjakan aksi tertentu bila pengguna menghubungkan USB Flash Drive (UFD) pada komputer.

Saya dapat menggunakan event class Win32_DeviceChangeEvent untuk memeriksa apakah ada perangkat yang dihubungkan ke komputer. Bila nilai EventType dari Win32_DeviceChangeEvent adalah 2, maka ada perangkat yang dihubungkan ke USB dan bila nilai EventType adalah 3 maka ada perangkat yang dilepaskan dari port USB. Untuk mendaftarkan aksi untuk event class tertentu, saya dapat menggunakan perintah Register-WmiEvent di PowerShell. Sebagai contoh, gambar berikut ini memperlihatkan perintah PowerShell yang akan mencetak tulisan ke layar bila ada perangkat yang dihubungkan ke komputer:

Script yang mencetak tulisan bila ada perangkat yang dihubungkan ke USB

Script yang mencetak tulisan bila ada perangkat yang dihubungkan ke USB

Setelah perintah Register-WmiEvent diberikan, ia akan mendaftarkan sebuah event job yang akan terus bekerja di balik layar. Untuk menghapus atau mematikan event job tersebut, saya menggunakan perintah Remove-Job.

Sekarang, saya akan mengubah aksi pada event job menjadi sesuatu yang lebih rumit dibandingkan sekedar mencetak dengan Write-Host. Sebagai latihan, saya ingin men-copy file bernama virus.txt ke seluruh removable disk di komputer setiap kali ada perangkat USB yang dihubungkan ke komputer. Untuk memperoleh informasi mengenai removable disk di komputer, saya dapat menggunakan perintah PowerShell seperti berikut ini:

PS C:\> (gwmi Win32_LogicalDisk -Filter "DriveType=2").DeviceId

Untuk men-copy file, saya dapat menggunakan perintah Copy-Item atau aliasnya seperti cp dan copy. Sebagai contoh, perintah PowerShell berikut ini akan menghasilkan event job yang akan men-copy file virus.txt ke seluruh removable disk setiap kali ada perangkat USB yang dihubungkan ke komputer:

Script yang men-copy file ke semua removeable drive bila ada perangkat yang dihubungkan ke USB

Script yang men-copy file ke semua removeable drive bila ada perangkat yang dihubungkan ke USB

Salah satu masalah yang timbul pada perintah di atas adalah event job akan dikerjakan berkali-kali (terlihat dari output yang duplikat). Untuk mengatasinya, karena saya hanya tertarik pada penggunaan perangkat yang menyebabkan penambahan drive baru, maka saya dapat menggunakan sebuah turunan dari class Win32_DeviceChangeEvent, yaitu Win32_VolumeChangeEvent. Dengan demikian, saya dapat mengubah perintah yang saya pakai menjadi seperti berikut ini:

PS C:\> Register-WmiEvent -Query "SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2" -Action `
>> {
>>   $driveBaru = $Event.SourceEventArgs.NewEvent.DriveName
>>   cp -PassThru C:\virus.txt $driveBaru\virus.txt | `
>>      %{Write-Host "Berhasil men-copy $_"}
>> }
>>

Kali ini, proses pen-copy-an file tidak akan dikerjakan berkali-kali melainkan hanya akan dikerjakan sekali saja.

Agar perintah PowerShell di atas dapat dikerjakan ulang secara mudah, saya akan membuat versi script-nya. Saya dapat menggunakan PowerShell ISE seperti yang terlihat pada gambar berikut ini:

Script yang akan men-copy file ke drive yang baru terdeteksi

Script yang akan men-copy file ke drive yang baru terdeteksi

Saya menyimpan script tersebut dengan nama copy_usb.ps1. Saya juga melakukan sedikit perubahan pada script karena Windows PowerShell ISE memiliki keterbatasan dimana Copy-Item tidak dapat mengenali drive baru (padahal ini bekerja dengan baik bila diberikan secara langsung di shell). Untuk mengatasi hal tersebut, saya mengganti pemanggilan Copy-Item dengan perintah copy dari Command Prompt. Selain itu, saya juga menambahkan loop tak terhingga agar script ini tidak pernah selesai dikerjakan selama sistem operasi belum di-shutdown atau selama tidak terjadi kesalahan. Bila saya ingin script tetap lanjut dikerjakan bila terjadi kesalahan, saya perlu menambahkan -ErrorAction SilentlyContinue pada perintah Register-WmiEvent.

Agar script tersebut dikerjakan secara otomatis setiap kali komputer dinyalakan, saya akan melakukan konfigurasi dengan menjalankan gpedit.msc. Pada tampilan Local Group Policy Editor yang muncul, saya memilih User Configuration, Windows Settings, Scripts (Logon/Logoff), dan men-double click pada Logon. Pada dialog yang muncul, saya memilih tab PowerShell Scripts dan men-klik tombol Add… untuk menambahkan file script yang telah saya buat sebelumnya. Hasilnya akan terlihat seperti pada gambar berikut ini:

Menjalankan PowerShell Scripts secara otomatis

Menjalankan PowerShell Scripts secara otomatis

Sekarang, setiap kali saya menyalakan dan login ke sistem operasi Windows, script PowerShell di atas akan dijalankan secara otomatis, seperti yang terlihat pada tampilan Process Explorer berikut ini:

Script dijalankan setiap kali komputer dinyalakan dan pengguna login

Script dijalankan setiap kali komputer dinyalakan dan pengguna login

Iklan

PowerShell Yang Lebih Bertenaga Berkat WMI

Pada artikel Apa itu Windows Management Instrumentation (WMI), saya berkenalan dengan teknologi WMI di Windows. WMI Provider menyediakan class berisi property dan method yang dapat dipanggil secara langsung di PowerShell. Memakai class dan objek WMI secara langsung memang merupakan salah satu kelebihan PowerShell yang tidak dimiliki oleh Command Prompt. PowerShell 3 di Windows 8 dilengkapi dengan perintah Get-CimClass yang dapat dipakai untuk mendapatkan informasi mengenai class WMI beserta method dan property yang tersedia di class tersebut seperti pada gambar berikut ini:

PowerShell

PowerShell

Daftar seluruh class yang ada dapat dijumpai di http://msdn.microsoft.com/en-us/library/aa394084.aspx. Secara teknis, yang lebih sering dipakai adalah objek (instance dari class). Untuk memperoleh daftar objek WMI yang ada, saya dapat menggunakan Get-WmiObject seperti pada gambar berikut ini:

PowerShell

PowerShell

Pada artikel ini, saya akan mencoba memakai beberapa objek WMI yang disediakan oleh Windows di PowerShell. Sebagai contoh, untuk melihat informasi BIOS di komputer, saya dapat memeriksa objek Win32_BIOS seperti pada gambar berikut ini:

PowerShell

PowerShell

Pada perintah di atas, saya memakai gwmi yang merupakan alias untuk Get-WmiObject.

Untuk mendapatkan informasi tanggal, saya dapat membaca objek Win32_LocalTime seperti pada gambar berikut ini:

PowerShell

PowerShell

Untuk mendapatkan informasi mengenai sistem operasi Windows yang sedang aktif, saya dapat membaca informasi dari instance Win32_OperatingSystem seperti yang terlihat pada gambar berikut ini:

PowerShell

PowerShell

Untuk mendapatkan informasi mengenai komputer, saya dapat membaca property dari instance Win32_ComputerSystem seperti yang terlihat pada gambar berikut ini:

PowerShell

PowerShell

Untuk mendapatkan informasi mengenai layar, saya dapat membaca property dari instance Win32_VideoController seperti yang terlihat pada gambar berikut ini:

PowerShell

PowerShell

Untuk mendapatkan informasi mengenai partisi di hard drive, saya dapat membaca property dari instance Win32_DiskPartition seperti yang terlihat pada gambar berikut ini:

PowerShell

PowerShell

Untuk mendapatkan informasi software yang ter-install di Windows, saya dapat membaca property dari instance Win32_Product. Selain itu, saya juga dapat memanggil method yang ada untuk melakukan manipulasi software tersebut. Sebagai contoh, saya dapat memanggil method Uninstall untuk menghapus software yang bersangkutan, seperti yang terlihat pada gambar berikut ini:

PowerShell

PowerShell

Untuk mendapatkan informasi mengenai network adapter, saya dapat membaca property dari instance Win32_NetworkAdapter. Selain itu, saya dapat memanggil method Enable() atau Disable() untuk mengaktifkan dan mematikan network adapter yang bersangkutan. Sebagai contoh, saya dapat mematikan atau mengaktifkan seluruh network adapter yang ada dengan perintah seperti pada gambar berikut ini:

PowerShell

PowerShell

Membuat Script Untuk Windows PowerShell

Pada Windows Command Prompt, batch file yang berakhiran .bat adalah script yang berisi kumpulan baris perintah DOS yang akan dikerjakan sebagai satu kesatuan. Windows PowerShell juga memiliki hal serupa dalam bentuk file berakhiran .ps1. Selain itu, Windows juga sudah dilengkapi dengan Windows PowerShell Integrated Scripting Environment (ISE) yang merupakan sebuah GUI untuk menulis script PowerShell. Berikut ini adalah contoh tampilan PowerShell ISE:

Tampilan PowerShell ISE

Tampilan PowerShell ISE

Walaupun sebuah script dapat dijalankan di PowerShell ISE, belum tentu ia dapat dijalankan langsung di PowerShell. Hal ini karena secara default, Windows tidak membolehkan eksekusi script PowerShell, seperti yang terlihat pada contoh berikut ini:

PS C:\> .\latihan.ps1
.\latihan.ps1 : File C:\latihan.ps1 cannot be loaded because running scripts is disabled on this sy
stem. For more information, see about_Execution_Policies at http://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .\latihan.ps1
+ ~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

Untuk membolehkan eksekusi script PowerShell secara global, saya perlu menjalankan PowerShell sebagai Administrator dan memberikan perintah seperti:

PS C:\> Set-ExecutionPolicy Unrestricted

Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose
you to the security risks described in the about_Execution_Policies help topic at
http://go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

Windows menyediakan beberapa execution policy seperti Restricted, AllSigned, RemoteSigned, Unrestricted, Bypass, dan Defined. Yang disarankan adalah AllSigned dimana yang boleh dijalankan hanya script PowerShell yang telah di-beri informasi sertifikat digital (dibagian akhir file, dalam bentuk komentar). Bypass adalah execution policy yang paling leluasa.

Selain mengubah execution policy secara global melalui Set-ExecutionPolicy, saya juga dapat menjalankan script dengan memanggil PowerShell dari Command Prompt seperti berikut ini:

C:\> PowerShell -ExecutionPolicy Unrestricted ./latihan.ps1

Seperti apa bentuk script di PowerShell?

Script pada PowerShell mendukung variabel yang selalu diawali dengan tanda dollar seperti $nama dan $proses, seperti yang terlihat pada contoh berikut ini:

$nama = "solid snake"
Write-Host -ForegroundColor Yellow $nama

Sebuah variabel dapat menampung lebih dari satu nilai yang dipisahkan dengan tanda koma. Untuk melakukan looping pada nilai tersebut (array), saya dapat menggunakan foreach seperti pada:

$nama = "solid snake"
$daftarWarna = "Yellow", "Green", "Gray", "Black", "Blue"
foreach($warna in $daftarWarna) {
    Write-Host -ForegroundColor $warna $nama
}

Script di PowerShell bisa menggunakan while, do...while, do...until, for, if, dan switch seperti pada contoh berikut ini:

[int] $i = 1

while ($i -lt 10) {
    "Nilai `$i adalah $i"
    $i++
}

# hasilnya sama dengan:

$i = 1
do {
    "Nilai `$i adalah $i"
    $i++
} until ($i -ge 10)

# hasilnya sama dengan:

foreach($i in 1..9) {
    "Nilai `$i adalah $i"
}

# hasilnya sama seperti:

for($i=1; $i -le 9; $i++) {
    "Nilai `$i adalah $i"
}

Pada ekspresi boolean di script PowerShell, saya melakukan perbandingan dengan operator seperti -eq (sama dengan), -gt (lebih dari), -ge (lebih dari sama dengan), -like, -match dan sebagainya.

Selain itu, PowerShell juga mendukung module, function dan filter. Perbedaan antara function dan filter akan terlihat pada saat melakukan piping. Pada saat melakukan piping ke function, perintah di bagian kiri akan diselesaikan terlebih dahulu baru kemudian function di sebelah kanan dikerjakan. Beda dengan function, filter tidak menunggu hingga perintah di bagian kiri selesai, melainkan dikerjakan untuk setiap iterasi. Sebagai contoh, berikut ini adalah contoh penggunaan filter dalam script untuk menghapus cache Griffon yang sudah tidak ada proyeknya lagi:

Contoh Filter Di PowerShell

Contoh Filter Di PowerShell

Memakai PowerShell Bawaan Windows

Shell berbasis CLI yang sangat terkenal di Windows adalah Command Prompt. Shell yang dulunya dikenal sebagai MS-DOS Prompt ini dapat dipakai untuk mengerjakan perintah DOS seperti dir, cd, del dan sebagainya. DOS sudah lama punah. Oleh sebab itu, Windows juga dilengkapi dengan shell yang lebih canggih yang disebut sebagai Windows PowerShell. Windows 7 sudah dilengkapi dengan PowerShell 2, Windows 8 dilengkapi PowerShell 3 dan Windows 8.1 dilengkapi PowerShell 4. Walaupun demikian, tampaknya popularitas Command Prompt tidak akan dapat digeser oleh PowerShell.

Pada kesempatan ini, saya akan mencoba memakai beberapa perintah PowerShell. Untuk membuka shell tersebut, saya men-klik Start Menu, memilih All Programs, Accessories, Windows PowerShell dan men-klik icon Windows PowerShell. Saya kemudian dapat memberikan perintah PowerShell seperti yang terlihat pada gambar berikut ini:

Memakai PowerShell

Memakai PowerShell

Terlihat bahwa saya dapat memberikan dir dan cd seperti pada Command Prompt. Bedanya, pada PowerShell, segala sesuatunya adalah object (memiliki method dan properties). Perintah yang paling umum yang diberikan di PowerShell berada dalam bentuk cmdlet. Berbeda dengan perintah Command Prompt yang bersifat statis, cmdlet di-implementasi-kan dalam bentuk class .NET yang dapat ditambahkan oleh pengguna atau pihak ketiga.

Perintah dir dan cd yang saya pakai sebenarnya hanya sebuah alias ke cmdlet Get-ChildItem dan Set-Location. Untuk membuktikannya, saya dapat memberikan perintah Get-Alias seperti yang terlihat pada gambar berikut ini:

Memakai PowerShell

Memakai PowerShell

Jadi, perintah dir yang saya berikan sama saja dengan memanggil Cmdlet Get-ChildItem.

Pada Command Prompt, saya dapat men-format output dari dir dengan memberikan argumen seperti dir/w, dir/p dan sebagainya. Lalu bagaimana dengan PowerShell? Saya dapat menggunakan pipe operator yang merujuk ke Cmdlet dengan verb Format seperti Format-Wide seperti yang terlihat pada contoh berikut ini:

Memakai PowerShell

Memakai PowerShell

Sebagai contoh lainnya, saya dapat menggunakan Get-ChildItem untuk menampilkan seluruh file JAR yang ada di direktori dan subdirectori saat ini seperti yang terlihat pada gambar berikut ini:

Memakai PowerShell

Memakai PowerShell

Contoh lainnya, saya dapat menampilkan file JAR yang diurutkan berdasarkan ukuran file dari yang terbesar hingga terkecil, seperti yang terlihat pada gambar berikut ini:

Memakai PowerShell

Memakai PowerShell

Salah satu hal menarik yang saya suka dari PowerShell adalah Cmdlet Out-GridView yang dapat menampilkan object dalam bentuk tabel GUI. Sebagai contoh, saya dapat menampilkan hasil Get-ChildItem dalam bentuk GUI dengan menggunakan perintah seperti yang terlihat pada gambar berikut ini:

Memakai PowerShell

Memakai PowerShell

Selain itu, saya juga dapat mengisi argumen untuk sebuah Cmdlet melalui GUI dengan menggunakan Show-Command seperti pada gambar berikut ini:

Memakai PowerShell

Memakai PowerShell

Segala sesuatu yang diproses dalam PowerShell adalah objek. Untuk melihat property dan method yang dihasilkan, saya dapat menggunakan Get-Member seperti:

PS C:\simple-jpa-demo-inventory> Get-ChildItem | Get-Member


   TypeName: System.IO.DirectoryInfo

Name                      MemberType     Definition
----                      ----------     ----------
Mode                      CodeProperty   System.String Mode{get=Mode;}
Create                    Method         void Create(), void Create(System.Security.AccessControl.DirectorySecurity ...
CreateObjRef              Method         System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
CreateSubdirectory        Method         System.IO.DirectoryInfo CreateSubdirectory(string path), System.IO.Director...
Delete                    Method         void Delete(), void Delete(bool recursive)
EnumerateDirectories      Method         System.Collections.Generic.IEnumerable[System.IO.DirectoryInfo] EnumerateDi...
EnumerateFiles            Method         System.Collections.Generic.IEnumerable[System.IO.FileInfo] EnumerateFiles()...
EnumerateFileSystemInfos  Method         System.Collections.Generic.IEnumerable[System.IO.FileSystemInfo] EnumerateF...
Equals                    Method         bool Equals(System.Object obj)
GetAccessControl          Method         System.Security.AccessControl.DirectorySecurity GetAccessControl(), System....
GetDirectories            Method         System.IO.DirectoryInfo[] GetDirectories(), System.IO.DirectoryInfo[] GetDi...
GetFiles                  Method         System.IO.FileInfo[] GetFiles(string searchPattern), System.IO.FileInfo[] G...
GetFileSystemInfos        Method         System.IO.FileSystemInfo[] GetFileSystemInfos(string searchPattern), System...
GetHashCode               Method         int GetHashCode()
GetLifetimeService        Method         System.Object GetLifetimeService()
GetObjectData             Method         void GetObjectData(System.Runtime.Serialization.SerializationInfo info, Sys...
GetType                   Method         type GetType()
...

   TypeName: System.IO.FileInfo

Name                      MemberType     Definition
----                      ----------     ----------
Mode                      CodeProperty   System.String Mode{get=Mode;}
AppendText                Method         System.IO.StreamWriter AppendText()
CopyTo                    Method         System.IO.FileInfo CopyTo(string destFileName), System.IO.FileInfo CopyTo(s...
Create                    Method         System.IO.FileStream Create()
CreateObjRef              Method         System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
CreateText                Method         System.IO.StreamWriter CreateText()
Decrypt                   Method         void Decrypt()
Delete                    Method         void Delete()
...

Cmdlet Get-ChildItem pada perintah di atas akan mengembalikan array yang berisi System.IO.DirectoryInfo dan/atau System.IO.FileInfo.

Get-ChildItem tidak hanya dipakai untuk mengakses file system, tapi juga layanan yang ditawarkan oleh provider lainnya dalam bentuk analogi drive dan file. Untuk melihat apa saja provider yang tersedia, saya dapat menggunakan Get-PSProvider seperti pada contoh berikut ini:

PS C:\> Get-PSProvider

Name                 Capabilities                                      Drives
----                 ------------                                      ------
Alias                ShouldProcess                                     {Alias}
Environment          ShouldProcess                                     {Env}
FileSystem           Filter, ShouldProcess, Credentials                {C}
Function             ShouldProcess                                     {Function}
Registry             ShouldProcess, Transactions                       {HKLM, HKCU}
Variable             ShouldProcess                                     {Variable}

Sampai disini, yang saya akses adalah file dan direktori yang disediakan oleh FileSystem provider. Provider yang berbeda akan menawarkan drive yang berbeda. Untuk melihat apa saja yang dapat dipakai sebagai drive, saya dapat menggunakan Get-PSDrive seperti pada contoh berikut ini:

PS C:\simple-jpa-demo-inventory> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
Alias                                  Alias
C                1165,11        917,46 FileSystem    C:\                                      simple-jpa-demo-inventory
Cert                                   Certificate   \
D                                      FileSystem    D:\
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan

Sebagai contoh, saya dapat membaca isi registry dengan perintah seperti pada gambar berikut ini:

Memakai PowerShell

Memakai PowerShell

Apa itu Windows Management Instrumentation (WMI)?

Pada sebuah aplikasi Java, developer dapat mempublikasikan informasi seperti statistik melalui Java Management Extension (JMX). Application server untuk Java biasanya mendukung JMX dimana administrator dapat melakukan koneksi ke application server tersebut guna memantau konfigurasi dan statistik kinerja server tersebut. Administrator tidak perlu membuka sebuah halaman administrasi melainkan cukup memakai sebuah client yang mendukung JMX seperti JConsole untuk membaca informasi dari JMX MBean. Karena JMX adalah sebuah standar, maka dengan sebuah tool seperti JConsole, administrator dapat membaca informasi dari berbagai application server berbeda selama mereka mendukung JMX.

Windows memiliki teknologi yang mirip JMX yang disebutnya sebagai Windows Management Instrumentation (WMI). Dengan WMI, seorang administrator dapat mengatur atau memantau informasi yang disediakan oleh aplikasi atau komponen sistem operasi Windows dari jarak jauh. Komponen WMI terdiri atas WMI Managed Object, WMI Provider, WMI Infrastructure, dan WMI Consumer.

WMI Managed Object adalah sesuatu yang mirip dengan Managed Bean (MBean) di JMX. Ia mewakili data yang hendak dipublikasikan dalam bentuk class yang ditulis dengan Managed Object Format (MOF) Language. Setiap object dikelompokkan berdasarkan namespace. Secara default, namespace CIMV2, Default, Security dan WMI selalu ada. WMI Managed Object didefinisikan dan dipublikasikan oleh WMI Provider.

Untuk melihat WMI Managed Object dari provider bawaan Windows, saya dapat menggunakan WMI Tools yang dapat di-download terpisah. Pada saat memilih WMI Object Browser, browser Internet Explorer (atau browser default) akan dijalankan. Saya harus memastikan bahwa WMI Object Browser dijalankan dengan menggunakan Internet Explorer. Selain itu, saya perlu mengubah document mode dari Internet Explorer ke versi 7. Sebagai contoh, karena saya memakai Internet Explorer 11, maka saya menekan tombol F12, memilih icon Emulation, dan memilih 7 pada Document mode seperti yang terlihat pada gambar berikut ini:

Menentukan Document Mode Di IE 11

Menentukan Document Mode Di IE 11

Setelah itu, pada dialog Connect to namespace yang muncul, saya akan melakukan koneksi ke namespace dengan root\CIMV2. Saya kemudian men-klik tombol OK dua kali. Setelah itu, saya dapat melihat object yang ada di namespace root\CIMV2 seperti yang terlihat pada gambar berikut ini:

Melihat Managed Object Dengan WMI Object Browser

Melihat Managed Object Dengan WMI Object Browser

WMI Object Browser adalah sebuah contoh WMI Consumer yang memakai web browser melalui ActiveX controls. Windows juga menyediakan banyak alternatif lain untuk mengakses WMI Managed Object. Sebagai contoh, WMI Consumer juga bisa dalam bentuk aplikasi C/C++, .NET, shell script VB atau Windows PowerShell. Saya akan mencoba membaca informasi dari WMI dengan menggunakan Windows PowerShell yang sudah terintegrasi pada Windows 7. Untuk menjalankan PowerShell, saya memilih menu Start di pojok kiri bawah Desktop, lalu memilih menu All Programs, Accessories, Windows PowerShell, dan men-klik pada Windows PowerShell. Saya akan mencoba melihat objek Win32_UserAccount dengan perintah Get-WmiObject seperti yang terlihat pada gambar berikut ini:

Memakai WMI Di Windows PowerShell

Memakai WMI Di Windows PowerShell

WMI memiliki fasilitas query yang disebut sebagai WMI Queries (WQL) untuk mempermudah dalam mencari dan mengambil nilai dari WMI Mananaged Object. Sebagai contoh, pada perintah PowerShell berikut ini, saya mencari SID dari user Administrator:

Memakai WQL

Memakai WQL

WMI Infrastructure terdiri atas WMI repository dan object manager. Windows 7 menyediakan beberapa tool CLI yang berkaitan dengan WMI. Sebagai contoh, untuk memeriksa keabsahan WMI repository, saya dapat memberikan perintah berikut ini:

C:\> winmgmt /verifyrepository

Untuk memperbaiki WMI Repository yang rusak, saya dapat menggunakan perintah berikut ini:

C:\> winmgmt /salvagerepository
C:\> winmgmt /resetrepository

Untuk melakukan pengaturan keamanan (user yang berhak mengakses namespace tertentu), saya dapat membuka Computer Management, memilih Services And Applications, men-klik kanan pada WMI Control dan memilih Properties. Pada dialog WMI Control Properties yang muncul, saya memilih tab Security. Disini saya dapat melakukan pengaturan keamanan untuk setiap namespace yang ada seperti yang terlihat pada gambar berikut ini:

Pengaturan Keamanan Untuk WMI Namespace

Pengaturan Keamanan Untuk WMI Namespace