Membuat Skrip WMI

Anda dapat melihat atau memanipulasi informasi apa pun yang tersedia melalui WMI menggunakan skrip. Skrip dapat ditulis dalam bahasa skrip apa pun yang mendukung hosting skrip Microsoft ActiveX, termasuk Visual Basic Scripting Edition (VBScript), PowerShell, dan Perl. Windows Script Host (WSH), Active Server Pages, dan Internet Explorer dapat menghosting semua skrip WMI.

Catatan

Bahasa pembuatan skrip utama yang saat ini didukung oleh WMI adalah PowerShell. Namun, WMI juga berisi isi dukungan skrip yang kuat untuk VBScript dan bahasa lain yang mengakses Scripting API untuk WMI.

 

Bahasa Pembuatan Skrip WMI

Dua bahasa utama yang didukung oleh WMI adalah PowerShell dan VBScript (melalui Windows Script Host, atau WSH).

  • PowerShell dirancang dengan ingat integrasi yang ketat dengan WMI. Dengan demikian, banyak elemen WMI yang mendasar dibangun ke dalam cmdlet WMI: Get-WmiObject, Set-WmiInstance, Invoke-WmiMethod, dan Remove-WmiObject. Tabel berikut menjelaskan proses umum yang digunakan untuk mengakses informasi WMI. Perhatikan bahwa meskipun sebagian besar contoh ini menggunakan Get-WMIObject, banyak cmdlet PowerShell WMI memiliki parameter yang sama, seperti -Class atau -Credentials. Oleh karena itu, banyak dari proses ini juga berfungsi untuk objek lain. Untuk diskusi yang lebih mendalam tentang PowerShell dan WMI, lihat Menggunakan Cmdlet Get-WMiObject dan Windows PowerShell - Koneksi WMI.

  • VBScript, sebaliknya, secara eksplisit melakukan panggilan ke Scripting API untuk WMI, seperti yang disebutkan di atas. Bahasa lain, seperti Perl, juga dapat menggunakan API skrip untuk WMI. Namun, untuk keperluan dokumentasi ini, sebagian besar sampel yang menunjukkan API pembuatan skrip untuk WMI akan menggunakan VBScript. Namun, ketika teknik pemrograman khusus untuk VBScript, teknik tersebut akan dipanggil.

    VBScript pada dasarnya memiliki dua cara terpisah untuk mengakses WMI. Yang pertama adalah menggunakan objek SWbemLocator untuk terhubung ke WMI. Secara bergantian, Anda dapat menggunakan GetObject dan moniker. Moniker adalah string yang dapat menjelaskan sejumlah elemen: kredensial Anda, pengaturan peniruan identitas, komputer apa yang ingin Anda sambungkan, namespace WMI (yaitu, lokasi umum tempat WMI menyimpan grup objek), dan objek WMI apa yang ingin Anda ambil. Banyak contoh di bawah ini menggambarkan kedua teknik tersebut. Untuk informasi selengkapnya, lihat Membuat String Moniker dan Menjelaskan Lokasi Objek WMI.

    Terlepas dari teknik apa yang Anda gunakan untuk terhubung ke WMI, Anda mungkin akan mengambil satu atau beberapa objek dari Scripting API. Yang paling umum adalah SWbemObject, yang digunakan WMI untuk menggambarkan objek WMI. Sebagai alternatif, Anda dapat menggunakan objek SWbemServices untuk menggambarkan layanan WMI itu sendiri, atau objek SWbemObjectPath untuk menggambarkan lokasi objek WMI. Untuk informasi selengkapnya, lihat Membuat Skrip dengan Objek Bantuan SWbemObject dan Scripting.

Menggunakan WMI dan Bahasa Skrip, Bagaimana Cara...

... menyambungkan ke WMI?

Untuk VBScript dan Scripting API untuk WMI, ambil objek SWbemServices dengan moniker dan panggilan ke GetObject. Secara bergantian, Anda dapat tersambung ke server dengan panggilan ke SWbemLocator.ConnectServer. Anda kemudian dapat menggunakan objek untuk mengakses namespace layanan WMI atau instans kelas WMI tertentu.

Untuk PowerShell, menyambungkan ke WMI umumnya dilakukan langsung dalam panggilan cmdlet; dengan demikian, tidak ada langkah tambahan yang diperlukan.

Untuk informasi selengkapnya, lihat Menjelaskan Lokasi Objek WMI, Membuat String Moniker, dan Menyambungkan ke WMI dengan VBScript.

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(".", "root\cimv2")

' Second example: implicitly uses the local compuer (.) and default namespace ("root\cimv2")
Set objWMIService = GetObject("winmgmts:")

#Already has all the defaults set
get-WmiObject Win32_LogicalDisk

#Or, to be explicit,
get-WmiObject -class Win32_LogicalDisk -Computer "." -Namespace "root\cimv2" -Impersonation Impersonate

... mengambil informasi dari WMI?

Untuk VBScript dan Scripting API untuk WMI, gunakan fungsi pengambilan, seperti WbemServices.Get atau WbemServices.InstancesOf. Anda juga dapat menempatkan nama kelas objek untuk diambil dalam moniker, yang mungkin lebih efisien.

Untuk PowerShell, gunakan parameter -Class . Perhatikan bahwa -Class adalah parameter default; dengan demikian, Anda tidak perlu secara eksplisit menyatakannya.

Untuk informasi selengkapnya, lihat Mengambil Kelas WMI atau Data Instans.

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(".", "root\cimv2")
Set colScheduledJobs = objService.InstancesOf("Win32_ScheduledJob")

' Second example
SSet Service = GetObject("WinMgmts:{impersonationLevel=impersonate}!Win32_Service=""ALERTER""")

#default - you don't actually need to use the -Class parameter
Get-WMIObject Win32_WmiSetting

#but you can if you want to
Get-WMIObject -Class Win32_WmiSetting

... membuat kueri WMI?

Untuk VBScript dan Scripting API untuk WMI, gunakan metode SWbemServices.ExecQuery .

Untuk PowerShell, gunakan parameter -Query . Anda juga dapat memfilter menggunakan parameter -Filter .

Untuk informasi selengkapnya, lihat Mengkueri WMI.

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob")
For Each objJob in colScheduledJobs
    Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine

Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"

#or

get-wmiObject -Class Win32_LogicalDisk -Filter "DeviceID = 'C:'"

... menghitung melalui daftar objek WMI?

Untuk VBScript dan Scripting API untuk WMI, gunakan objek kontainer SWbemObjectSet , yang diperlakukan dalam skrip sebagai koleksi yang dapat dijumlahkan. Anda dapat mengambil SWbemObjectSet dari panggilan dari SWbemServices.InstancesOf atau SWbemServices.ExecQuery.

PowerShell dapat mengambil dan menangani enumerasi seperti halnya objek lain; tidak ada yang sangat unik untuk WMI.

Untuk informasi selengkapnya, lihat Mengakses Koleksi.

For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDevice")

$logicalDevices = Get-WmiObject CIM_LogicalDevice
foreach ($device in $logicalDevices)
{
    $device.name
}

#or, to be more compact

Get-WmiObject cim_logicalDevice | ForEach-Object { $_.name }

... mengakses namespace layanan WMI yang berbeda?

Untuk VBScript dan Scripting API untuk WMI, sebutkan namespace di moniker, atau Anda dapat secara eksplisit menyatakan namespace dalam panggilan ke SwbemLocator.ConnectServer.

Untuk PowerShell, gunakan parameter -Namespace . Namespace default adalah "root\cimV2"; namun, banyak kelas lama disimpan di "root\default".

Untuk menemukan lokasi kelas WMI tertentu, lihat halaman referensi. Secara bergantian, Anda dapat menjelajahi namespace secara manual menggunakan get-WmiObject.

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(".", "root\cimv2")

' Second example
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")

Get-WmiObject -list * -Namespace root\default

#or, to retrieve all namespaces,
Get-WmiObject -Namespace root -Class __Namespace

... mengambil semua instans anak dari kelas?

Untuk bahasa yang secara langsung menggunakan Scripting API untuk WMI dan PowerShell, WMI mendukung pengambilan kelas anak dari kelas dasar. Dengan demikian, untuk mengambil instans anak, Anda hanya perlu mencari kelas induk. Contoh berikut mencari CIM_LogicalDisk, yang merupakan kelas WMI yang telah diinstal sebelumnya yang mewakili disk logis pada sistem komputer berbasis Windows. Dengan demikian, mencari kelas induk ini juga mengembalikan instans Win32_LogicalDisk, yang digunakan Windows untuk menggambarkan hard drive. Untuk informasi selengkapnya, lihat Model Informasi Umum. WMI memasok seluruh skema kelas yang telah diinstal sebelumnya yang memungkinkan Anda mengakses dan mengontrol objek terkelola. Untuk informasi selengkapnya, lihat Kelas Win32 dan Kelas WMI..

For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk")
  WScript.Echo "Instance:", Disk.Name
Get-WmiObject CIM_LogicalDisk | ForEach-Object { "Instance: " + $_.Name  }

... temukan objek WMI?

Untuk Scripting API untuk WMI dan PowerShell, WMI menggunakan kombinasi namespace layanan, nama kelas, dan properti kunci untuk mengidentifikasi instans WMI tertentu secara unik. Bersama-sama, ini dikenal sebagai jalur objek WMI. Untuk VBScript, properti SWbemObject.Path_ menjelaskan jalur untuk objek tertentu yang dikembalikan oleh API skrip. Untuk PowerShell, setiap objek WMI akan memiliki properti __PATH. Untuk informasi selengkapnya, lihat Menjelaskan Lokasi Objek WMI

Selain namespace layanan dan nama kelas, objek WMI juga akan memiliki properti kunci, yang secara unik mengidentifikasi instans tersebut dibandingkan dengan instans lain di komputer Anda. Misalnya, properti DeviceID adalah properti kunci untuk kelas Win32_LogicalDisk . Untuk informasi selengkapnya, lihat Managed Object Format (MOF).

Akhirnya, jalur Relatif hanyalah bentuk jalur yang dipersingkat, dan mencakup nama kelas dan nilai kunci. Dalam contoh di bawah ini, jalurnya mungkin "\\computerName\root\cimv2:Win32_LogicalDisk.DeviceID="D:"", sementara jalur relatifnya adalah ""Win32LogicalDisk.DeviceID="D"".

For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk")
  WScript.Echo "Instance:", Disk.Path_.Relpath

'or to get the path
For Each Disk In GetObject("winmgmts:").InstancesOf ("CIM_LogicalDisk")
  WScript.Echo "Instance:", Disk.Path_
#retrieving the path
Get-WmiObject CIM_LogicalDisk | ForEach-Object { "Instance: " + $_.__PATH  }

#retrieving the relative path
Get-WmiObject CIM_LogicalDisk | ForEach-Object { "Instance: " + $_.__RELPATH  }

... mengatur informasi di WMI?

Untuk VBScript dan Scripting API untuk WMI, gunakan metode SWbemObject.Put_ .

Untuk PowerShell, Anda dapat menggunakan metode Put, atau Set-WmiInstance lainnya.

Untuk informasi selengkapnya, lihat Memodifikasi Properti Instans.

wbemCimtypeString = 8
Set objSWbemService = GetObject("Winmgmts:root\default")
Set objClass = objSWbemService.Get()
objClass.Path_.Class = "NewClass"

' Add a property
' String property
objClass.Properties_.add "PropertyName", wbemCimtypeString  
' Make the property a key property 
objClass.Properties_("PropertyName").Qualifiers_.add "key", true

' Write the new class to the root\default namespace in the repository
Set objClassPath = objClass.Put_
WScript.Echo objClassPath.Path

'Create an instance of the new class using SWbemObject.SpawnInstance
Set objNewInst = GetObject("Winmgmts:root\default:NewClass").Spawninstance_

objNewInst.PropertyName = "My Instance"

' Write the instance into the repository
Set objInstancePath = objNewInst.Put_
WScript.Echo objInstancePath.Path

$mySettings = get-WMIObject Win32_WmiSetting
$mySettings.LoggingLevel = 1
$mySettings.Put()

#or

Set-WMIInstance -class Win32_WMISetting -argument @{LoggingLevel=1}

... menggunakan kredensial yang berbeda?

Untuk VBScript dan Scripting API untuk WMI, gunakan parameter UserName dan Password dalam metode SWbemLocator.ConnectServer .

Untuk PowerShell, gunakan parameter -Credential .

Perhatikan bahwa Anda hanya dapat menggunakan kredensial alternatif pada sistem jarak jauh. Untuk informasi selengkapnya, lihat Mengamankan Klien Scripting.

strComputer = "remoteComputerName" 
strDomain = "DOMAIN" 
Wscript.StdOut.Write "Please enter your user name:"
strUser = Wscript.StdIn.ReadLine 
Set objPassword = CreateObject("ScriptPW.Password")
Wscript.StdOut.Write "Please enter your password:"
strPassword = objPassword.GetPassword()
 
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
                                                     "Root\CIMv2", _
                                                     strUser, _
                                                     strPassword, _
                                                     "MS_409", _
                                                     "ntlmdomain:" + strDomain)
Set colSwbemObjectSet = objSWbemServices.ExecQuery("Select * From Win32_Process")
For Each objProcess in colSWbemObjectSet
    Wscript.Echo "Process Name: " & objProcess.Name 
Next

$Computer = "atl-dc-01"

Get-WmiObject -Namespace "root\cimv2" -Class Win32_Process -Credential FABRIKAM\administrator  `
-ComputerName $Computer

... mengakses komputer jarak jauh?

Untuk VBScript dan Scripting API untuk WMI, secara eksplisit menyatakan nama komputer baik di moniker, atau dalam panggilan ke SWbemLocator.ConnectServer. Untuk informasi selengkapnya, lihat Menyambungkan ke WMI Dari Jarak Jauh dengan VBScript.

Untuk PowerShell, gunakan parameter -ComputerName . Untuk informasi selengkapnya, lihat Menyambungkan ke WMI Dari Jarak Jauh dengan PowerShell.

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer("myRemoteServerName", "root\cimv2")
Set colScheduledJobs = objService.ExecQuery("SELECT * FROM Win32_ScheduledJob")
For Each objJob in colScheduledJobs
    Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine

'example 2

strComputer = "myRemoteServerName"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colScheduledJobs = objWMIService.ExecQuery("Select * from Win32_ScheduledJob")
For Each objJob in colScheduledJobs
    Wscript.Echo "Job ID: " & objJob.JobId & "Command: " & objJob.Command & VBNewLine

$Computer = "atl-dc-01"

Get-WmiObject -Namespace "root\cimv2" -Class Win32_logicalDisk -ComputerName $Computer

... atur tingkat Autentikasi dan Peniruan?

Untuk VBScript dan Scripting API untuk WMI, gunakan properti SWbemServices.Security_ pada objek server yang dikembalikan, atau atur nilai yang relevan di moniker.

Untuk PowerShell, gunakan parameter -Authentication dan -Impersonation , masing-masing. Untuk informasi selengkapnya, lihat Mengamankan Klien Scripting.

Untuk informasi selengkapnya, lihat Mengamankan Klien Scripting.

' First example
Set Service = GetObject("WinMgmts:{impersonationLevel=impersonate}!Win32_Service=""ALERTER""")

' Second example
Set Locator = CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer       
service.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate  
Set objinstance = Service.Get("Win32_Service=""ALERTER""")

$Computer = "atl-dc-01"

Get-WmiObject -Namespace "root\cimv2" -Class Win32_Process -Impersonation Impersonate `
 -Authentication PacketIntegrity -Credential FABRIKAM\administrator -ComputerName $Computer

... menangani kesalahan di WMI?

Untuk Scripting API untuk WMI, penyedia dapat menyediakan objek SWbemLastError untuk memberikan informasi lebih lanjut tentang kesalahan.

Dalam VBScript khususnya, penanganan kesalahan juga didukung menggunakan objek Err asli. Anda juga dapat mengakses objek SWbemLastError, seperti yang dijelaskan di atas. Untuk informasi selengkapnya, lihat Mengambil Kode Kesalahan.

Untuk PowerShell, Anda dapat menggunakan teknik penanganan kesalahan PowerShell standar. Untuk informasi selengkapnya, lihat Pengantar Penanganan Kesalahan di PowerShell.

'using Err
On Error Resume Next
Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'")
Wscript.Echo Err.Number

'using SWbemLastError

On Error Resume Next
Set obj = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'")
Set LastError = createobject("wbemscripting.swbemlasterror")
Wscript.Echo "Operation = " & LastError.operation & VBCRLF & "ParameterInfo = " _
            & LastError.ParameterInfo & VBCRLF & "ProviderName = " & LastError.ProviderName