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

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: