Membuat Skrip WMI
Anda dapat melihat atau memanipulasi informasi apa pun yang disediakan 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. Host Skrip Windows (WSH), Halaman Server Aktif, dan Internet Explorer dapat menghosting semua skrip WMI.
Nota
Bahasa pembuatan skrip utama yang saat ini didukung oleh WMI adalah PowerShell. Namun, WMI juga memiliki dukungan skrip yang kuat untuk VBScript dan bahasa pemrograman lain yang mengakses Scripting API untuk WMI.
Bahasa Pembuatan Skrip WMI
Dua bahasa utama yang didukung oleh WMI adalah PowerShell dan VBScript (melalui Host Skrip Windows, atau WSH).
PowerShell dirancang dengan integrasi erat menggunakan WMI sebagai pertimbangan utama. Dengan demikian, sebagian besar elemen WMI yang mendasar dibangun ke dalam cmdlet WMI: Get-WmiObject, Set-WmiInstance, Invoke-WmiMethod, dan Remove-WmiObject. Tabel berikut ini 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 PowerShell dan WMI yang lebih mendalam, 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 scripting API 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 menggunakanGetObjectdan moniker. Moniker adalah string yang dapat menggambarkan sejumlah elemen: kredensial Anda, pengaturan peniruan, komputer apa yang ingin Anda sambungkan, ruang nama 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. Untuk informasi selengkapnya, lihat Membangun String Moniker dan Menjelaskan Lokasi Objek WMI.
Terlepas dari teknik apa yang Anda gunakan untuk terhubung ke WMI, Anda kemungkinan akan mengambil satu atau beberapa objek dari Scripting API. Yang paling umum adalah SWbemObject, yang digunakan WMI untuk menggambarkan objek WMI. Secara bergantian, Anda dapat menggunakan objekSWbemServicesuntuk menggambarkan layanan WMI itu sendiri, atau objek SWbemObjectPath untuk menggambarkan lokasi objek WMI. Untuk informasi selengkapnya, lihat pembuatan Skrip dengan SWbemObject dan Objek Pembantu Pembuatan Skrip .
Menggunakan WMI dan Bahasa Skrip, Bagaimana Cara...
-
... menyambungkan ke WMI?
-
Untuk VBScript dan Scripting API untuk WMI, ambil objek SWbemServicesdengan moniker dan lakukan panggilan ke GetObject . Secara bergantian, Anda dapat terhubung 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 yang ingin diambil ke dalam sebuah moniker, yang mungkin lebih efisien.
Untuk PowerShell, gunakan parameter -Class. Perhatikan bahwa -Class adalah parameter default; dengan demikian, Anda tidak perlu menyatakannya secara eksplisit.
Untuk informasi selengkapnya, lihat Mengambil Data Kelas atau Instans WMI.
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 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, nyatakan 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 dalam "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 entitas turunan dari kelas?
-
Untuk bahasa yang secara langsung menggunakan Scripting API untuk WMI dan PowerShell, WMI mendukung mengambil subkelas 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 disk. Untuk informasi selengkapnya, lihat Common Information Model. WMI menyediakan 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 }
-
... menemukan objek WMI?
-
Untuk API Scripting untuk WMI dan PowerShell, WMI menggunakan kombinasi namespace, 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 pembuatan 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 sebagai alternatif Set-WmiInstance.
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}
-
... gunakan 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, sebutkan nama komputer secara eksplisit baik dalam moniker atau dalam pemanggilan ke SWbemLocator.ConnectServer. Untuk informasi selengkapnya, lihat Menghubungkan ke WMI Secara Jarak Jauh dengan VBScript.
Untuk PowerShell, gunakan parameter -ComputerName. Untuk informasi selengkapnya, lihat Menghubungkan 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. 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
-
...mengatasi kesalahan pada WMI?
-
Untuk Scripting API untuk WMI, penyedia dapat menyediakan objek SWbemLastError untuk memberikan informasi lebih lanjut tentang kesalahan.
Secara khusus dalam VBScript, penanganan kesalahan juga dapat dilakukan dengan menggunakan objek Err. Anda juga dapat mengakses objekSWbemLastError, seperti yang dijelaskan di atas. Untuk informasi selengkapnya, lihat Menarik kembali 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