Memakai WMI/CIM dari C# dan PowerShell — panduan praktis pengambilan info perangkat keras, pemantauan proses, dan kueri jarak jauh

· · Windows, C#, .NET, PowerShell, WMI, CIM, Aplikasi bisnis, Pengembangan Windows

«Saya ingin menampilkan nomor seri dan nama model PC di layar aplikasi bisnis.» «Saya ingin memantau ruang disk kosong server dan menaikkan peringatan.» «Saya ingin mendeteksi ketika proses tertentu start.» «Saya ingin mengumpulkan keadaan PC di lokasi jauh di satu tempat.» — syarat semacam ini muncul terus-menerus ketika membangun aplikasi bisnis dan alat pengelolaan Windows. Dan jawaban klasiknya adalah WMI (Windows Management Instrumentation), atau, memakai nama standarnya, CIM (Common Information Model).

Permintaan klasik dan WMI/CIMJawaban klasik atas permintaan klasik aplikasi bisnis yaitu menampilkan nomor seri dan nama model, memantau ruang disk kosong, mendeteksi proses yang start, dan meng-query PC jarak jauh adalah WMI, atau dalam nama standar CIMNomor seri dan modelWMI (nama standar: CIM)Memantau ruang disk kosongMendeteksi proses yang startMeng-query PC jarak jauh

Gambar 1: Jawaban klasik atas empat permintaan klasik aplikasi bisnis adalah WMI/CIM.

Yang merepotkan adalah informasi seputar WMI mencampur yang lama dan yang baru. Cari, dan Anda akan menemukan artikel sepuluh tahun yang memakai Get-WmiObject berdampingan dengan artikel yang memakai Get-CimInstance, dan di sisi C# ada dua silsilah terpisah, System.Management dan Microsoft.Management.Infrastructure. Sulit membedakan mana cara menulis yang berlaku sekarang dan mana yang «masih jalan, tetapi bukan yang harus dipilih untuk kode baru.» Faktanya, Get-WmiObject sama sekali tidak ada di PowerShell 7, dan ini tiba-tiba muncul ketika memigrasikan skrip internal yang ditulis untuk 5.1.

Artikel ini ditujukan kepada pengembang C#/PowerShell yang mengimplementasikan pengambilan informasi perangkat keras, pemantauan proses, dan kueri PC jarak jauh di aplikasi bisnis. Ia menata, dari pemahaman minimal struktur WMI/CIM lewat cmdlet CIM PowerShell, dua API C#, resep praktis yang sering dipakai, jebakan seputar kinerja, izin, dan 64-bit, sampai cara menilai «situasi di mana Anda tidak seharusnya memakai WMI» — semuanya berpijak pada sumber primer per Agustus 2026.

1. Intinya dulu

  • CIM adalah model standar industri untuk informasi pengelolaan yang disusun DMTF, dan WMI adalah implementasinya oleh Microsoft. API keluarga «CIM» di PowerShell dan C# adalah API generasi sekarang yang mengikuti standar ini, dan mereka tersambung ke infrastruktur WMI yang sama.1
  • Di PowerShell, yang berlaku sekarang adalah cmdlet CIM (Get-CimInstance / Invoke-CimMethod / Register-CimIndicationEvent). Cmdlet WMI lama (Get-WmiObject dan empat lainnya) telah dihapus sejak PowerShell 6 dan tidak jalan di PowerShell 7.2
  • Namespace default adalah root/CIMV2, dan kueri sehari-hari pada dasarnya mempersempit kelas Win32_* di situ dengan WQL.3
  • Kueri jarak jauh secara default memakai WSMan (WinRM). Menentukan -ComputerName membuat sesi WSMan sementara. Jika Anda akan meng-query tujuan yang sama berulang kali, memakai ulang sesi CIM (New-CimSession) adalah praktik mapan demi kinerja, dan untuk tujuan lama di mana WinRM tidak bisa dikonfigurasi, ada opsi protokol DCOM.34
  • C# punya dua silsilah: System.Management (ManagementObjectSearcher) dan Microsoft.Management.Infrastructure (CimSession). Keduanya khusus Windows, dan di .NET yang berlaku sekarang Anda membawanya masuk lewat NuGet. Jika Anda akan membangun kueri jarak jauh atau pemantauan ke dalam produk sungguhan, API MI — yang berbagi sistem tipe dengan cmdlet CIM — lebih cocok.56
  • Deteksi proses yang start dengan langganan peristiwa, bukan polling. Berlangganan Win32_ProcessStartTrace harus dijalankan dengan hak administrator.78
  • Jangan memakai SELECT * karena kebiasaan. Mempersempit apa yang ditransfer dengan -Filter / -Property / -KeyOnly mencegah kira-kira setengah masalah kinerja WMI.3
  • WMI bukan solusi universal. Untuk pemantauan kinerja berfrekuensi tinggi, membaca dan menulis pengaturan aplikasi sendiri, atau panggilan fungsi OS sekali jalan, performance counter, registri, API Win32, atau cmdlet khusus lebih cocok (lihat tabel keputusan di bagian 8).

2. Apa itu WMI/CIM — standar vs implementasi, namespace, kelas, dan WQL

Pertama, mari menata istilahnya sekali untuk selamanya.

Istilah Apa itu
CIM (Common Information Model) Model standar industri untuk merepresentasikan sasaran pengelolaan seperti sistem, aplikasi, jaringan, dan perangkat. Disusun dan dipelihara DMTF (Distributed Management Task Force)1
WBEM (Web-Based Enterprise Management) Inisiatif industri untuk membuat teknologi standar mengakses informasi pengelolaan di lingkungan perusahaan1
WMI Implementasi Microsoft atas WBEM. Ia merepresentasikan sasaran pengelolaan memakai standar CIM dan tertanam di Windows1
MI (Windows Management Infrastructure) Versi generasi berikutnya dari WMI. Sepenuhnya kompatibel dengan WMI lama, dan sebagian besar provider baru ditulis dalam MI1
Hubungan standar CIM dan implementasi WMIStandar CIM yang disusun dan dipelihara DMTF dipakai dalam kerangka inisiatif WBEM, implementasinya oleh Microsoft adalah WMI, MI generasi berikutnya sepenuhnya kompatibel dengan WMI lama, dan API keluarga CIM tersambung ke infrastruktur WMI yang samaDisusun dan dipelihara DMTFCIM (model standar industri)WBEM (inisiatif industri)WMI (implementasi Microsoft)MI (generasi berikutnya, kompatibel penuh)API keluarga CIM (PowerShell / C#)

Gambar 2: CIM adalah spesifikasi, WMI adalah implementasi di Windows. Tujuan sambungan API keluarga CIM adalah infrastruktur WMI yang sama.

Sebagai pengembang, ada empat potongan struktur yang patut dipahami.

  • Namespace: hierarki yang mengelompokkan kelas. Untuk kueri sehari-hari Anda hampir selalu memakai root/CIMV2, yang juga default bagi cmdlet CIM.3 Yang lain termasuk root\default (provider registri, di antaranya).
  • Kelas: tipe yang merepresentasikan sasaran pengelolaan, seperti Win32_ComputerSystem (komputer itu sendiri), Win32_LogicalDisk (drive logis), atau Win32_Process (proses). Kelas khusus Windows yang mewarisi kelas standar CIM (seperti CIM_LogicalDisk) membawa prefiks Win32_.9
  • Provider: komponen yang memasok substansi sebuah kelas. Ketika Anda meng-query-nya, provider menanyakan OS di tempat dan membangun nilainya.
  • WQL: bahasa kueri mirip SQL. Seperti pada SELECT Name, State FROM Win32_Service WHERE StartMode = 'Auto', ia memperlakukan kelas seperti tabel lalu memfilternya. WQL juga bahasa kueri default bagi cmdlet CIM.3

«Membaca informasi OS dan perangkat keras lewat kumpulan kelas dan bahasa kueri yang terpadu» — itulah nilai yang diberikan WMI. Sebaliknya, penulisan dan operasi kontrol terbatas pada subset kelas yang punya metode yang bisa dipanggil lewat Invoke-CimMethod; ia bukan mekanisme yang bisa melakukan apa pun.

Struktur kueri WMIKueri WQL diarahkan ke kelas Win32_* di dalam namespace root/CIMV2, provider yang memasok substansi kelas menanyakan OS di tempat untuk membuat nilai, lalu hasil dikembalikanKueri dengan WQLNamespace root/CIMV2Kelas Win32_*ProviderMenanyakan OS di tempatMengembalikan hasil

Gambar 3: Kueri menelusuri namespace, kelas, lalu provider, dan nilainya dibuat di tempat.

3. Pemakaian dari PowerShell — cmdlet CIM adalah yang berlaku, cmdlet WMI sudah dihapus

3.1. Dasarnya: Get-CimInstance

# Berdasarkan nama kelas (namespace default root/CIMV2)
Get-CimInstance -ClassName Win32_OperatingSystem

# Tulis hanya isi klausa WHERE di -Filter (jangan tulis kata kunci WHERE itu sendiri)
Get-CimInstance -ClassName Win32_Service -Filter "StartMode = 'Auto' AND State <> 'Running'"

# Ambil hanya properti yang Anda butuhkan, untuk mengurangi jumlah yang ditransfer
Get-CimInstance -ClassName Win32_Process -Property Name, ProcessId, CreationDate

# Pakai -Query jika Anda ingin menulis WQL mentah
Get-CimInstance -Query "SELECT * FROM Win32_Process WHERE Name LIKE 'p%'"

-Filter persis klausa WHERE milik WQL, dan -Property membatasi kolom mana yang diambil.3 Nilai kembalian adalah objek CimInstance, dan properti tanggal (seperti CreationDate atau LastBootUpTime) dikembalikan sudah terkonversi ke DateTime. Tidak seperti Get-WmiObject lama, objek yang diambil tidak membawa metode secara langsung, jadi pemanggilan metode dilakukan dengan menyalurkannya ke Invoke-CimMethod.

Pemanggilan metode CimInstanceCimInstance yang dikembalikan Get-CimInstance sudah punya properti tanggal terkonversi ke DateTime, tetapi tidak membawa metode secara langsung, jadi pemanggilan metode dilakukan dengan menyerahkan instans ke Invoke-CimMethodGet-CimInstanceObjek CimInstanceTanggal sudah DateTimeTidak membawa metode langsungSerahkan ke Invoke-CimMethodPemanggilan metode

Gambar 4: CimInstance tidak membawa metode, jadi pemanggilan metode dilakukan dengan menyerahkannya ke Invoke-CimMethod.

# Memanggil metode pada instans: ambil pemilik setiap proses
Get-CimInstance -ClassName Win32_Process -Filter "Name = 'notepad.exe'" |
    Invoke-CimMethod -MethodName GetOwner

# Memanggil metode statis kelas: meluncurkan proses
Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments @{ CommandLine = 'notepad.exe' }

# Memeriksa definisi kelas (properti dan metode)
Get-CimClass -ClassName Win32_Process

3.2. Tabel migrasi dari cmdlet WMI lama

Sejak PowerShell 6 (termasuk PowerShell 7 yang berlaku sekarang), cmdlet WMI v1 berikut telah dihapus. Fungsionalitas yang sama disediakan modul CimCmdlets (WMI v2).2

Lama (hingga Windows PowerShell 5.1) Yang berlaku (cmdlet CIM) Catatan
Get-WmiObject Get-CimInstance Konsep -Filter / -Query sama
Get-WmiObject -List Get-CimClass Menemukan dan memeriksa definisi kelas
Invoke-WmiMethod Invoke-CimMethod Argumen dilewatkan sebagai hashtable lewat -Arguments @{ }
Register-WmiEvent Register-CimIndicationEvent Langganan peristiwa (bagian 6.3)
Set-WmiInstance Set-CimInstance Mengubah properti yang bisa ditulis
Remove-WmiObject Remove-CimInstance Menghapus instans

Cmdlet CIM juga jalan di Windows PowerShell 5.1, jadi apa pun yang Anda tulis mulai sekarang harus ditulis memakai CIM meski akan dijalankan di 5.1 — dengan begitu Anda tidak menyisakan biaya migrasi. Untuk gambaran penuh koeksistensi dan migrasi antara 5.1 dan 7, lihat «Perbedaan Windows PowerShell 5.1 dan PowerShell 7».

Alasan menulis skrip baru dengan CIMSkrip yang ditulis dengan cmdlet WMI masih jalan di 5.1 tetapi sudah dihapus sejak PowerShell 6 sehingga harus ditulis ulang saat migrasi, sedangkan cmdlet CIM juga jalan di 5.1 jadi jika yang baru ditulis di sisi CIM tidak ada biaya migrasi tersisaCmdlet WMICmdlet CIMSkrip yang baru ditulisDitulis dengan yang mana?Jalan di 5.1Juga jalan di 5.1Sudah dihapus di PowerShell 7Ditulis ulang saat migrasiTidak ada biaya migrasi

Gambar 5: Jika yang baru ditulis dengan cmdlet CIM, tidak perlu ditulis ulang saat migrasi ke PowerShell 7.

4. Kueri jarak jauh — sesi CIM (WSMan secara default) dan opsi DCOM

Jika Anda tidak menentukan tujuan, cmdlet CIM tersambung ke WMI lokal lewat COM; jika Anda menentukan -ComputerName, mereka membuat sesi sementara lewat protokol WSMan (WinRM) untuk tersambung. Ketika Anda akan melakukan beberapa operasi terhadap komputer yang sama, membuat sesi CIM dan memakainya ulang lebih baik untuk kinerja.3

Memilih cara koneksi CIMTanpa spesifikasi tersambung COM ke WMI lokal, spesifikasi ComputerName membuat sesi sementara WSMan di setiap kueri, beberapa operasi ke tujuan yang sama lebih efisien dengan memakai ulang New-CimSession, dan untuk tujuan tanpa WinRM ada opsi protokol DCOMTidakYaSekaliBeberapaMenjalankan cmdlet CIMComputerName ditentukan?Koneksi COM ke WMI lokalBeberapa operasi ke tujuan sama?Sesi sementara WSManPakai ulang New-CimSessionDibuat di setiap kueriTujuan tanpa WinRMOpsi protokol DCOM

Gambar 6: Kueri jarak jauh secara default memakai WSMan; untuk beberapa operasi ke tujuan yang sama, praktik mapannya adalah memakai ulang sesi CIM.

# Untuk kueri sekali jalan, pakai -ComputerName (sesi sementara dibuat setiap kali)
Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName Server01, Server02

# Untuk kueri berulang, pakai ulang sesi CIM
$session = New-CimSession -ComputerName Server01
Get-CimInstance -ClassName Win32_OperatingSystem -CimSession $session
Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType = 3" -CimSession $session
Remove-CimSession $session

Untuk tujuan yang tidak bisa dijangkau lewat WSMan — misalnya mesin lama di mana WinRM tidak bisa dikonfigurasi — Anda bisa memilih protokol DCOM sebagai gantinya.4

$dcom = New-CimSessionOption -Protocol Dcom
$session = New-CimSession -ComputerName OldServer -SessionOption $dcom

Prasyarat kueri jarak jauh adalah sebagai berikut.

  • WinRM harus dikonfigurasi di tujuan. winrm quickconfig menyetel layanan agar start otomatis, membuat listener HTTP (port default 5985), dan mendaftarkan pengecualian firewall, semuanya sekaligus.10 Jika Anda ingin tersambung lewat HTTPS (port default 5986), ini saja tidak cukup — Anda perlu menyiapkan sertifikat server dan secara terpisah mengonfigurasi listener HTTPS dengan sesuatu seperti winrm quickconfig -transport:https.10
  • Port yang relevan harus terbuka di firewall mana pun di sepanjang jalur. Pekerjaan praktis merancang dan mendaftarkan aturan inbound dibahas di artikel «Firewall Windows dan aplikasi bisnis».
  • Autentikasi. Di lingkungan domain, Kerberos menyediakan autentikasi bersama. Di workgroup, Kerberos tidak tersedia, jadi Anda mungkin perlu mendaftarkan tujuan ke daftar TrustedHosts di sisi klien. Jaga daftar itu seramping mungkin.10
  • Izin. Di bawah konfigurasi default, kueri dan operasi WMI jarak jauh pada dasarnya dilakukan dengan akun yang termasuk grup administrator tujuan. Untuk membukanya bagi pengguna biasa, Anda perlu mengonfigurasi izin akses baik di WinRM maupun di namespace WMI.10
  • Catat bahwa DCOM tidak punya port listener tetap (ia memakai port RPC dinamis), yang membuatnya lebih sulit dirancang menyeberangi batas firewall. Paling aman mengasumsikan WSMan sebagai default untuk apa pun yang Anda bangun mulai sekarang.
Memeriksa prasyarat kueri jarak jauhDi tujuan, winrm quickconfig sekaligus menyetel layanan start otomatis, membuat listener HTTP, dan mendaftarkan pengecualian firewall; listener HTTPS dikonfigurasi terpisah dengan sertifikat; di lingkungan workgroup mungkin perlu mendaftar ke TrustedHostswinrm quickconfigLayanan start otomatisMembuat listener HTTP (5985)Pengecualian firewallListener HTTPS (5986)Siapkan sertifikat, konfigurasi terpisahLingkungan workgroupDaftar ke TrustedHosts

Gambar 7: winrm quickconfig melakukan konfigurasi default sekaligus; listener HTTPS dan autentikasi workgroup ditangani terpisah.

5. Pemakaian dari C# — System.Management dan Microsoft.Management.Infrastructure

Ada dua silsilah API untuk memakai WMI dari C#. Keduanya khusus Windows.

  System.Management Microsoft.Management.Infrastructure (API MI)
Membawanya masuk Termasuk secara default di .NET Framework. Di .NET yang berlaku sekarang, paket NuGet System.Management5 Paket NuGet Microsoft.Management.Infrastructure6
Kelas titik masuk ManagementObjectSearcher (serahkan WQL untuk meng-query)5 CimSession (Create → QueryInstances / InvokeMethod / Subscribe)6
Sistem tipe ManagementObject / ManagementEventWatcher11 CimInstance / CimSessiontipe yang sama dengan cmdlet CIM3
Akses jarak jauh Berbasis DCOM Berbasis WSMan (sesi CIM). Varian asinkron (*Async) tersedia6
Paling cocok untuk Pengambilan informasi lokal. Memelihara aset kode yang ada Membangun kueri jarak jauh dan pemantauan. Desain yang dipasangkan dengan PowerShell

5.1. System.Management: dasar ManagementObjectSearcher

Anda menyerahkan WQL sebagai string dan menerima koleksi hasil lewat Get().5

// NuGet: System.Management (khusus Windows)
using System.Management;

using var searcher = new ManagementObjectSearcher(
    @"root\cimv2",
    "SELECT DeviceID, FreeSpace, Size FROM Win32_LogicalDisk WHERE DriveType = 3");

foreach (ManagementObject disk in searcher.Get())
{
    var freeGb = (ulong)disk["FreeSpace"] / 1024.0 / 1024.0 / 1024.0;
    var sizeGb = (ulong)disk["Size"] / 1024.0 / 1024.0 / 1024.0;
    Console.WriteLine($"{disk["DeviceID"]} kosong {freeGb:F1} GB / total {sizeGb:F1} GB");
}

Properti dikembalikan sebagai object lewat indexer, jadi Anda perlu memeriksa dokumentasi kelas untuk tipe CIM-nya (dalam contoh ini, FreeSpace / Size adalah uint649) lalu melakukan cast sesuai itu. Mengira ia int lalu melakukan cast atas dasar itu, yang berujung InvalidCastException, adalah batu sandungan klasik pertama di sini.

Jebakan mengambil properti dan castProperti System.Management dikembalikan sebagai object lewat indexer, jadi Anda harus memeriksa tipe CIM di dokumentasi kelas lalu melakukan cast; jika dikira int lalu di-cast, hasilnya InvalidCastExceptionAmbil lewat indexerDikembalikan sebagai objectPeriksa tipe CIM di dokumenCast ke tipe yang benarDikira int lalu di-castInvalidCastException

Gambar 8: Properti dikembalikan sebagai object, jadi periksa tipe CIM dulu baru melakukan cast.

5.2. API MI: dasar CimSession

CimSession menangani akses lokal dan jarak jauh dalam bentuk yang sama. Ia mencakup enumerasi, kueri, pemanggilan metode, langganan peristiwa, dan varian asinkron semuanya di satu tempat.6

// NuGet: Microsoft.Management.Infrastructure (khusus Windows)
using Microsoft.Management.Infrastructure;

// CimSession.Create(null) untuk lokal, atau serahkan nama komputer untuk jarak jauh
using CimSession session = CimSession.Create(null);

IEnumerable<CimInstance> disks = session.QueryInstances(
    @"root\cimv2", "WQL",
    "SELECT DeviceID, FreeSpace, Size FROM Win32_LogicalDisk WHERE DriveType = 3");

foreach (CimInstance disk in disks)
{
    var deviceId = (string)disk.CimInstanceProperties["DeviceID"].Value;
    var free = (ulong)disk.CimInstanceProperties["FreeSpace"].Value;
    Console.WriteLine($"{deviceId} kosong {free / 1024.0 / 1024 / 1024:F1} GB");
}

Karena ia bekerja dengan CimInstance yang sama yang dikembalikan cmdlet CIM PowerShell, alur pengembangan «coba dulu di PowerShell, lalu salin ke C#» terhubung secara alami. Jika Anda merancang integrasi C# dan PowerShell itu sendiri, lihat juga «Cara menjalankan PowerShell dari C# (CSharp) dan menerima hasilnya sebagai objek».

Alur coba di PowerShell lalu salin ke C#Cmdlet CIM PowerShell dan API MI C# memakai tipe CimInstance yang sama, sehingga alur pengembangan mencoba di PowerShell dulu lalu menyalinnya ke C# terhubung secara alamiCoba di PowerShellCmdlet CIMImplementasi C#API MITipe CimInstance yang samaPenyalinan terhubung alami

Gambar 9: Cmdlet CIM dan API MI memakai tipe CimInstance yang sama, sehingga prototipe terhubung ke implementasi penuh.

6. Resep praktis yang sering dipakai

6.1. Referensi cepat kelas yang umum

Informasi yang diinginkan Kelas Properti utama
Pabrikan / nama model Win32_ComputerSystem Manufacturer, Model
Nomor seri sasis Win32_BIOS SerialNumber
Versi OS / waktu boot Win32_OperatingSystem Caption, Version, LastBootUpTime
Ruang disk kosong Win32_LogicalDisk DeviceID, FreeSpace, Size, DriveType9
Keadaan layanan Win32_Service Name, State, StartMode
Daftar proses Win32_Process Name, ProcessId, CommandLine

6.2. Andalan manajemen aset: nomor seri, nama model, dan ruang disk kosong

# Informasi model dan nomor seri (untuk mencocokkan dengan buku aset PC)
$cs   = Get-CimInstance -ClassName Win32_ComputerSystem -Property Manufacturer, Model
$bios = Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber
[pscustomobject]@{
    Manufacturer = $cs.Manufacturer
    Model        = $cs.Model
    Serial       = $bios.SerialNumber
}

# Ruang kosong di disk lokal (DriveType = 3)
Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType = 3" |
    Select-Object DeviceID,
        @{ Name = 'FreeGB'; Expression = { [math]::Round($_.FreeSpace / 1GB, 1) } },
        @{ Name = 'SizeGB'; Expression = { [math]::Round($_.Size / 1GB, 1) } }

DriveType = 3 merepresentasikan «disk lokal», mengecualikan removable (2), network drive (4), dan drive CD (5).9 Untuk pemantauan, cukup menjalankan skrip ini ke setiap server lewat sesi CIM dan Anda punya fondasi pemantauan disk tanpa agen.

Fondasi pemantauan disk tanpa agenFilter DriveType 3 mengecualikan removable, network drive, dan CD sehingga hanya disk lokal yang jadi sasaran, lalu skrip yang sama dijalankan ke setiap server lewat sesi CIM, membentuk fondasi pemantauan disk tanpa agenSkrip ruang kosongFilter DriveType = 3Kecualikan removable dll.Lewat sesi CIMJalankan ke setiap serverPemantauan tanpa agen

Gambar 10: Menjalankan skrip yang dipersempit ke disk lokal ke setiap server lewat sesi CIM adalah fondasi pemantauan.

6.3. Mendeteksi proses yang start — langganan peristiwa

Alih-alih «secara berkala mengambil Win32_Process dengan polling lalu melihat selisihnya», pakai langganan peristiwa. Cara termudah menangkap proses yang start adalah berlangganan Win32_ProcessStartTrace (kelas peristiwa dari provider jejak kernel, dengan properti seperti ProcessName / ProcessID / ParentProcessID8).

# Jalankan dari sesi PowerShell yang ditinggikan (administrator)
$action = {
    $name = $Event.SourceEventArgs.NewEvent.ProcessName
    $id   = $Event.SourceEventArgs.NewEvent.ProcessID
    Write-Host "Proses dimulai: $name (PID=$id)"
}
Register-CimIndicationEvent -ClassName Win32_ProcessStartTrace `
    -SourceIdentifier ProcessStarted -Action $action

Langganan tetap hidup selama sesi PowerShell yang mendaftarkannya masih hidup, dan -Action dijalankan setiap kali sebuah proses start. Hati-hati jangan menjalankan perintah batal langganan tepat sesudah ini dalam batch yang sama — itu hanya membuat langganan hilang sebelum pemantauan sempat mulai. Jalankan langkah batal langganan hanya ketika Anda selesai memantau.

# Ketika pemantauan selesai: hapus langganan
Unregister-Event -SourceIdentifier ProcessStarted

Register-CimIndicationEvent mendaftarkan langganan berdasarkan nama kelas atau kueri peristiwa WQL, dan blok skrip -Action dijalankan setiap kali peristiwa tiba.7 Berlangganan kelas ini mensyaratkan hak administrator.7 Siapa yang bisa menerima peristiwa dikontrol oleh descriptor keamanan kelas peristiwa, dan pengguna biasa tanpa hak yang ditinggikan akan ditolak aksesnya.8

Alur langganan peristiwa proses startDi sesi PowerShell dengan hak administrator, Register-CimIndicationEvent mendaftarkan langganan, peristiwa tiba setiap kali proses start lalu Action dijalankan, dan Unregister-Event membatalkan langganan ketika pemantauan selesaiWMISesi PowerShellWMISesi PowerShellJalankan sebagai administratorDaftar langganan dengan Register-CimIndicationEventPeristiwa tiba setiap proses startJalankan -ActionBatalkan dengan Unregister-Event (saat selesai)

Gambar 11: Langganan tetap berlaku selama sesi yang mendaftarkannya hidup, dan pembatalan dilakukan ketika pemantauan selesai.

Opsi lain adalah peristiwa pembuatan instans generik (__InstanceCreationEvent), yang bisa dipakai dengan kelas apa pun. Ini bekerja dengan membuat WMI melakukan polling pada interval yang Anda tentukan dengan WITHIN lalu mengubah selisihnya menjadi peristiwa, jadi Anda sendiri yang harus memutuskan trade-off antara interval deteksi dan beban.

Dua cara langganan deteksi proses startWin32_ProcessStartTrace berlangganan kelas peristiwa provider jejak kernel, sedangkan __InstanceCreationEvent generik membuat WMI melakukan polling pada interval WITHIN lalu mengubah selisih menjadi peristiwa, sehingga Anda sendiri yang memutuskan trade-off interval deteksi versus bebanDeteksi proses yang startWin32_ProcessStartTrace__InstanceCreationEventLangganan jejak kernelPolling interval WITHINTrade-off interval vs beban

Gambar 12: Berlangganan kelas peristiwa khusus, atau memakai peristiwa pembuatan instans generik dengan interval polling.

# Pantau instans Win32_Process baru dengan polling setiap 5 detik
$query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process'"
Register-CimIndicationEvent -Query $query -SourceIdentifier ProcPoll -Action {
    Write-Host "Dimulai: $($Event.SourceEventArgs.NewEvent.TargetInstance.Name)"
}

Di C# (System.Management), ManagementEventWatcher memainkan peran yang sama.11

using System.Management;

// Dari proses yang berjalan sebagai administrator
var watcher = new ManagementEventWatcher(
    new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
watcher.EventArrived += (_, e) =>
{
    var name = (string)e.NewEvent["ProcessName"];
    var pid  = (uint)e.NewEvent["ProcessID"];
    Console.WriteLine($"Proses dimulai: {name} (PID={pid})");
};
watcher.Start();
// Jangan lupa watcher.Stop() dan Dispose ketika pemantauan selesai

Jika Anda membangun ini ke dalam komponen pemantauan yang menetap, pastikan desain Anda juga mencakup mendaftar ulang langganan ketika ia putus (saat layanan restart atau saat error). Pertimbangan desain untuk «memeriksa dan menampilkan keadaan», termasuk pemantauan perangkat, dibahas di «Praktik terbaik memeriksa dan menampilkan keadaan perangkat eksternal».

Siklus hidup langganan pemantauan menetapDalam pemantauan menetap, keadaan berlangganan aktif bisa putus karena restart layanan atau error, jadi desain harus mencakup deteksi putus, daftar ulang, dan kembali ke berlangganan aktifRestart layanan / errorBerlangganan aktifLangganan terputusDaftar ulang

Gambar 13: Dalam pemantauan menetap, desain harus mencakup daftar ulang lalu kembali ke berlangganan aktif ketika langganan putus.

7. Jebakan — kinerja, izin, 64-bit, repositori, dan tanggal

7.1. SELECT * dan polling yang terlalu agresif

Kueri WMI adalah «provider yang membangun nilai di tempat» — ia tidak gratis. Ada dua antipola klasik.

  • Memakai SELECT * karena kebiasaan. Mengambil setiap properti setiap baris Win32_Process menggembungkan pekerjaan provider dan transfer jaringan (ketika jarak jauh) sesuai itu. Persempit baris dengan -Filter, persempit kolom dengan -Property, dan pakai -KeyOnly jika yang Anda butuhkan hanyalah kunci untuk operasi lanjutan. Semuanya adalah sarana resmi yang disiapkan «untuk mengurangi ukuran objek dan lalu lintas jaringan.»3
  • Polling interval pendek. Desain seperti «Get-CimInstance Win32_Process setiap detik» harus diganti dengan pendekatan langganan peristiwa dari bagian 6.3. Bahkan jika Anda harus memakai gaya polling (WITHIN), lebarkan interval sampai yang benar-benar cukup bagi syaratnya.

Juga, mengulang -ComputerName satu tujuan pada satu waktu terhadap mesin jarak jauh itu boros, karena sesi sementara dibuat untuk setiap kueri — beralihlah ke memakai ulang sesi CIM untuk beberapa operasi.3

Antipola kinerja dan penggantinyaKebiasaan SELECT asterisk dipersempit dengan Filter dan Property, KeyOnly jika hanya kunci, polling interval pendek diganti langganan peristiwa, dan pengulangan ComputerName satu mesin diganti memakai ulang sesi CIMKebiasaan SELECT *Persempit Filter dan PropertyHanya kunci: KeyOnlyPolling interval pendekGanti langganan peristiwaComputerName satu per satuPakai ulang sesi CIM

Gambar 14: Mempersempit baris, kolom, dan kunci serta mengganti polling dengan langganan peristiwa mencegah setengah masalah kinerja WMI.

7.2. Izin untuk langganan peristiwa

Seperti dibahas di bagian 6.3, berlangganan keluarga Win32_ProcessStartTrace mensyaratkan hak administrator.7 «Jalan di mesin pengembangan (dijalankan sebagai administrator), tetapi pemantauan tidak jalan di lingkungan pengguna biasa milik pelanggan» adalah mode kegagalan klasik, setara dengan dialog notifikasi firewall. Jika Anda membangun pemantauan ke dalam aplikasi bisnis yang berjalan sebagai pengguna biasa, pertimbangkan memisahkan bagian pemantauan ke layanan Windows (berjalan sebagai LocalSystem, misalnya) dan menghubungkannya ke aplikasi utama lewat komunikasi antarproses.

Konfigurasi pemantauan di lingkungan pengguna biasaLangganan yang mensyaratkan hak administrator dipisah dari aplikasi yang jalan sebagai pengguna biasa, bagian pemantauan dijalankan sebagai layanan Windows di LocalSystem atau serupa, dan dihubungkan ke aplikasi lewat komunikasi antarprosesKomunikasi antarprosesLayanan Windows pemantauanLangganan jejak startJalan sebagai LocalSystem dll.Aplikasi (pengguna biasa)

Gambar 15: Langganan yang butuh hak administrator dipisah ke sisi layanan, dan dihubungkan ke aplikasi lewat komunikasi antarproses.

7.3. 32-bit vs 64-bit dan provider

Di Windows 64-bit, beberapa provider ada sebagai versi 32-bit dan 64-bit, dan secara default versi yang cocok dengan bitness pemanggil yang menjawab permintaan.12 Contoh klasiknya adalah provider registri (StdRegProv) di bawah root\default: membaca dari aplikasi 32-bit mengembalikan nilai dari sisi Wow6432Node (tampilan 32-bit).12 Jika «nilai registri yang dibaca lewat WMI tidak cocok dengan yang ditunjukkan regedit», ini hal pertama yang harus dicurigai. Jika Anda membutuhkan tampilan yang lain, Anda bisa memintanya secara eksplisit dengan menyetel __ProviderArchitecture (dan, jika ingin memaksanya, __RequiredArchitecture) di konteks koneksi.12 Gambaran keseluruhan masalah bitness juga dibahas di «Memanggil API Win32 dengan aman dari C# — panduan praktis P/Invoke».

Pemilihan provider di lingkungan 64-bitSecara default provider yang bitness-nya cocok dengan aplikasi pemanggil yang menjawab, kueri registri dari aplikasi 32-bit menerima nilai sisi Wow6432Node, tetapi Anda bisa secara eksplisit meminta tampilan sebaliknya dengan __ProviderArchitecture32-bit64-bitBitness pemanggil?Provider 32-bit menjawabProvider 64-bit menjawabRegistri: nilai Wow6432Node__ProviderArchitectureMinta tampilan sebaliknya

Gambar 16: Secara default sisi yang cocok dengan bitness pemanggil yang menjawab, jadi aplikasi 32-bit membaca sisi Wow6432Node.

7.4. Gejala dan penanganan repositori WMI yang rusak

Definisi kelas WMI disimpan di repositori (bukan berkas tunggal — berkas di dalam folder Repository bersama-sama berfungsi sebagai basis data13). Ketika ia menjadi tidak konsisten, error seperti «kelas yang seharusnya ada tidak ditemukan» atau «namespace tidak valid» mulai muncul, meski tidak ada yang berubah di sisi aplikasi. Pakai winmgmt.exe untuk mendiagnosis dan memperbaikinya.13

rem Pemeriksaan konsistensi (hasil "inconsistent" berarti ada masalah)
winmgmt /verifyrepository

rem Pemeriksaan konsistensi, dan bangun ulang jika ada masalah (isi yang terbaca digabung)
winmgmt /salvagerepository

Yang penting adalah jangan menjadikan menghapus atau mereset repositori sebagai langkah pertama Anda. Error yang muncul lewat WMI bisa berasal dari bagian OS lain, dan Microsoft sendiri menyatakan dengan tegas bahwa menghapus repositori sebagai tanggapan pertama «bisa menyebabkan kerusakan pada sistem atau pada aplikasi yang terpasang.»13 Ikuti urutan: periksa dengan /verifyrepository, lalu perbaiki dengan /salvagerepository.

Langkah diagnosis inkonsistensi repositori WMIJika muncul error seperti kelas tidak ditemukan, periksa konsistensi dengan verifyrepository winmgmt, jika inconsistent bangun ulang dengan salvagerepository, dan jangan jadikan penghapusan atau inisialisasi repositori sebagai langkah pertamaYaTidakError kelas tidak ditemukan dll.winmgmt /verifyrepositoryHasilnya inconsistent?winmgmt /salvagerepositoryCurigai bagian OS lainIsi yang terbaca digabungHapus atau inisialisasi repositoriBukan langkah pertama

Gambar 17: Patuhi urutan periksa dengan verify lalu perbaiki dengan salvage, dan jangan jadikan penghapusan sebagai langkah pertama.

7.5. Mengonversi format tanggal DMTF

Tanggal WMI disimpan sebagai string dalam format DMTF yang ditetapkan spesifikasi CIM: yyyymmddHHMMSS.mmmmmm±UUU (nilai di ujung adalah offset dari UTC dalam menit — misalnya, 20260801100000.000000+540). Jangan potong dan tempel nilai mentah dengan pemrosesan string; pakai API konversi sebagai gantinya.

  • C# (System.Management): ManagementDateTimeConverter menyediakan konversi antara format DMTF dan DateTime / TimeSpan.11
  • API keluarga CIM (Get-CimInstance / API MI): properti tanggal dikembalikan sudah terkonversi ke DateTime, jadi Anda tidak pernah menemui masalah ini sejak awal. (Get-CimInstance Win32_OperatingSystem).LastBootUpTime bisa dipakai langsung sebagai DateTime dalam perhitungan.
Penanganan format tanggal DMTFTanggal WMI disimpan sebagai string format DMTF; jika nilai mentah dibaca dengan System.Management, konversi dengan ManagementDateTimeConverter; API keluarga CIM sudah mengembalikan DateTime terkonversi, jadi jangan potong-tempel string sendiriSystem.ManagementAPI keluarga CIMString format DMTFDiambil lewat API mana?ManagementDateTimeConverterSudah DateTime terkonversiKonversi ke DateTime / TimeSpanPotong-tempel string sendiriJangan dipakai

Gambar 18: Serahkan konversi string DMTF pada API konversi; dengan API keluarga CIM, pakai DateTime yang sudah terkonversi apa adanya.

8. Situasi di mana Anda tidak seharusnya memakai WMI — tabel keputusan alat

WMI unggul sebagai «antarmuka baca yang terpadu», tetapi ia tidak selalu pilihan yang optimal. Berikut aturan praktis memilih alat.

Yang ingin Anda lakukan Alat yang tepat Mengapa bukan WMI
Mengambil informasi perangkat keras dan konfigurasi OS, kueri jarak jauh tanpa agen WMI/CIM Inilah lapangan WMI — lebih terpadu daripada mengetuk API khusus satu per satu
Membaca dan menulis pengaturan aplikasi sendiri Membaca registri langsung (Microsoft.Win32.Registry) atau berkas konfigurasi Akses registri lewat WMI adalah jalan memutar, dan ia juga mewarisi masalah bitness dari bagian 7.3
Pemantauan kinerja berfrekuensi tinggi dan berkelanjutan seperti pemakaian CPU Performance counter (System.Diagnostics.PerformanceCounter, dll.) Counter dibuat khusus untuk ini. Polling WMI interval pendek kalah baik di beban maupun akurasi
Panggilan fungsi OS sekali jalan, atau pemrosesan yang butuh latensi rendah API Win32 (P/Invoke) WMI membawa overhead lewat COM/provider
Mengenumerasi dan memanipulasi proses lokal ketika izin proses sendiri sudah cukup System.Diagnostics.Process Mandiri di pustaka standar, dengan lebih sedikit ketergantungan
Mengonfigurasi fitur pengelolaan Windows seperti firewall atau jaringan Cmdlet berbasis CIM khusus seperti Get-NetFirewallRule Kumpulan cmdlet yang dibangun dan dipelihara untuk tujuan tertentu lebih akurat dan lebih aman daripada berburu kelas WMI mentah
Mendeteksi perubahan berkas atau folder FileSystemWatcher Jangan bawa WMI ke wilayah yang sudah punya API khusus

Aturan praktisnya sederhana: pakai mekanisme khusus di wilayah yang sudah punya mekanisme khusus, dan cadangkan WMI/CIM untuk kueri lintas dan kueri jarak jauh. Contoh Get-NetFirewallRule di baris terakhir, secara internal, adalah kumpulan cmdlet yang dibangun di atas CIM — kasus «menikmati manfaat WMI/CIM tanpa menyentuhnya secara langsung.»

Sumbu keputusan alatDi wilayah yang sudah punya mekanisme khusus, pakai mekanisme khusus itu; untuk kueri lintas dan kueri jarak jauh di wilayah tanpa mekanisme khusus, pakai WMI dan CIM; cmdlet berbasis CIM khusus adalah bentuk yang menikmati manfaat tanpa menyentuh WMI dan CIM secara langsungAdaTidakAda mekanisme khusus?Pakai mekanisme khususPakai WMI / CIMKueri lintas dan jarak jauhCmdlet berbasis CIM khususHanya menikmati manfaat

Gambar 19: Di wilayah yang sudah punya mekanisme khusus, pakai yang khusus; pakai WMI/CIM untuk kueri lintas dan kueri jarak jauh.

9. Ringkasan

  • CIM adalah standar industri DMTF, dan WMI adalah implementasinya oleh Microsoft. Baik cmdlet CIM PowerShell maupun API MI C# adalah titik masuk generasi sekarang yang mengikuti standar ini.
  • Di PowerShell, Get-CimInstance / Invoke-CimMethod / Register-CimIndicationEvent yang berlaku. Get-WmiObject dan cmdlet WMI lainnya tidak ada di PowerShell 7, jadi tulis skrip baru di sisi CIM meski menargetkan 5.1.
  • Kueri jarak jauh secara default memakai WSMan (WinRM), dan beberapa operasi harus memakai ulang sesi CIM. Untuk tujuan di mana WinRM tidak dikonfigurasi, DCOM adalah jalan keluar yang tersedia.
  • Di C#, pilih antara System.Management (praktis, berorientasi lokal) dan Microsoft.Management.Infrastructure (berorientasi jarak jauh dan pemantauan, berbagi sistem tipe cmdlet CIM). Keduanya paket NuGet khusus Windows.
  • Pantau proses lewat langganan peristiwa, bukan polling. Berlangganan Win32_ProcessStartTrace mensyaratkan hak administrator.
  • Hindari SELECT * dan polling interval pendek — persempit dengan -Filter / -Property / -KeyOnly. Ingat bahwa kueri dari proses 32-bit dilayani provider 32-bit, bahwa tanggal DMTF butuh API konversi, dan bahwa repositori yang rusak harus ditangani dalam urutan verify → salvage, bukan penghapusan.
  • Jangan bawa WMI ke wilayah yang sudah punya mekanisme khusus (pengaturan, performance counter, panggilan API sekali jalan) — cadangkan WMI/CIM untuk kueri lintas dan kueri jarak jauh. Satu kalimat itu merangkum di mana ia berada.

Artikel terkait

Area konsultasi terkait

KomuraSoft LLC menangani membangun pengambilan informasi perangkat keras, pemantauan proses, dan kueri PC jarak jauh dengan WMI/CIM ke dalam aplikasi bisnis, memigrasikan skrip internal berbasis Get-WmiObject ke cmdlet CIM, dan menyelidiki jenis masalah di mana «jalan di mesin pengembangan tetapi gagal dengan error izin di situs pelanggan.» Kami bisa mendukung Anda sepanjang jalur dari prototipe di PowerShell sampai implementasi penuh di C#.

Tautan referensi

  1. Microsoft Learn, About WMI. Tentang WMI sebagai implementasi Microsoft atas WBEM (inisiatif industri untuk mengembangkan teknologi standar mengakses informasi pengelolaan di lingkungan perusahaan), merepresentasikan sasaran pengelolaan memakai CIM (Common Information Model) standar industri yang disusun dan dipelihara DMTF (Distributed Management Task Force); tentang MI (Windows Management Infrastructure) generasi berikutnya yang sepenuhnya kompatibel dengan WMI lama; dan tentang koneksi WMI jarak jauh yang memakai DCOM, dengan WinRM berbasis WS-Management sebagai alternatif.  2 3 4 5

  2. Microsoft Learn, Differences between Windows PowerShell 5.1 and PowerShell 7.x. Tentang cmdlet WMI v1 (Register-WmiEvent / Set-WmiInstance / Invoke-WmiMethod / Get-WmiObject / Remove-WmiObject) yang telah dihapus dari PowerShell, dan tentang cmdlet modul CimCmdlets (WMI v2) yang menyediakan fungsionalitas yang sama dengan fitur baru dan sintaks yang dirancang ulang.  2

  3. Microsoft Learn, Get-CimInstance (CimCmdlets). Tentang tersambung ke WMI lokal lewat sesi COM ketika ComputerName maupun CimSession tidak ditentukan, dan membuat sesi sementara lewat protokol WsMan ketika -ComputerName ditentukan; tentang tersambung lewat sesi CIM yang direkomendasikan demi kinerja ketika melakukan beberapa operasi terhadap komputer yang sama; tentang -Filter sebagai klausa where WQL/CQL yang tidak menyertakan kata kunci WHERE; tentang -Property dan -KeyOnly yang mengurangi ukuran objek dan lalu lintas jaringan; tentang namespace default root/CIMV2 dan bahasa kueri default (-QueryDialect) WQL; tentang keluaran Microsoft.Management.Infrastructure.CimInstance; tentang contoh pemanggilan GetOwner yang digabung dengan Invoke-CimMethod; dan tentang cmdlet ini yang khusus Windows.  2 3 4 5 6 7 8 9 10

  4. Microsoft Learn, New-CimSessionOption (CimCmdlets). Tentang opsi sesi CIM yang punya dua kumpulan parameter, untuk WsMan dan untuk DCOM; tentang -Protocol yang menerima Dcom / Default / Wsman; tentang contoh menyerahkan opsi yang dibuat dengan New-CimSessionOption -Protocol Dcom ke -SessionOption milik New-CimSession untuk membuat sesi CIM DCOM; dan tentang tingkat impersonation default sesi DCOM yang Impersonate.  2

  5. Microsoft Learn, ManagementObjectSearcher Class (System.Management). Tentang ini sebagai kelas titik masuk paling umum untuk mengambil informasi pengelolaan, mengambil koleksi objek pengelolaan berdasarkan kueri WQL yang ditentukan; tentang ia menerima ObjectQuery dan ManagementScope (namespace WMI) dan mengembalikan ManagementObjectCollection lewat Get(); dan tentang System.Management.dll yang disediakan sebagai paket NuGet System.Management.  2 3 4

  6. Microsoft Learn, CimSession Class (Microsoft.Management.Infrastructure). Tentang Microsoft.Management.Infrastructure.dll yang disediakan sebagai paket NuGet Microsoft.Management.Infrastructure; tentang membuat sesi lewat Create(computerName); tentang menjalankan kueri lewat QueryInstances(namespace, queryDialect, query); dan tentang ia menyediakan EnumerateInstances / GetInstance / InvokeMethod / Subscribe bersama varian asinkron (*Async) masing-masing, sambil mengimplementasikan IDisposable.  2 3 4 5

  7. Microsoft Learn, Register-CimIndicationEvent (CimCmdlets). Tentang berlangganan indication (peristiwa) berdasarkan nama kelas atau ekspresi kueri dan menamai langganan dengan -SourceIdentifier; tentang contoh berlangganan Win32_ProcessStartTrace, dengan catatan bahwa ia mensyaratkan menjalankan PowerShell sebagai administrator; tentang contoh mereferensikan ProcessName / ProcessId dari $Event.SourceEventArgs.NewEvent di dalam blok skrip -Action; tentang tersambung lewat sesi WsMan sementara ketika -ComputerName ditentukan, dan secara lokal lewat COM ketika tidak; dan tentang memakai Unregister-Event untuk menghapus langganan.  2 3 4

  8. Microsoft Learn, Win32_ProcessStartTrace class. Tentang ini sebagai kelas peristiwa yang menunjukkan start proses baru, dengan properti termasuk ProcessName / ProcessID / ParentProcessID / SessionID / Sid; tentang properti SECURITY_DESCRIPTOR sebagai descriptor yang dipakai provider peristiwa untuk menentukan pengguna mana yang bisa menerima peristiwa; dan tentang namespace Root\CIMV2, yang disediakan provider jejak kernel (Krnlprov.dll).  2 3

  9. Microsoft Learn, Win32_LogicalDisk class. Tentang Win32_LogicalDisk sebagai kelas turunan CIM_LogicalDisk yang merepresentasikan perangkat penyimpanan lokal; tentang nilai DriveType (2 = removable, 3 = disk lokal, 4 = network drive, 5 = CD, dan seterusnya); tentang FreeSpace / Size sebagai nilai byte uint64; tentang DeviceID sebagai kunci; dan tentang contoh kueri VBScript / C# yang memfilter berdasarkan DriveType = 3.  2 3 4

  10. Microsoft Learn, Installation and configuration for Windows Remote Management. Tentang listener WinRM yang secara default tidak dikonfigurasi, artinya pesan WS-Management tidak bisa dikirim atau diterima; tentang winrm quickconfig yang menyetel layanan agar start otomatis, mengonfigurasi listener HTTP/HTTPS, dan mendaftarkan pengecualian firewall; tentang port default WinRM 2.0 yaitu HTTP 5985 / HTTPS 5986; tentang menyetel TrustedHosts seramping mungkin ketika autentikasi bersama (Kerberos) tidak bisa dibentuk, seperti di workgroup; dan tentang descriptor keamanan default (RootSDDL) yang mengontrol akses jarak jauh ke listener, plus konfigurasi tambahan yang diperlukan untuk mengizinkan pengguna non-administrator memakai plug-in WMI.  2 3 4

  11. Microsoft Learn, System.Management Namespace. Tentang ini sebagai namespace yang meng-query infrastruktur WMI lewat keluarga kelas ManagementObjectSearcher, dan menangani langganan peristiwa lewat ManagementEventWatcher; tentang WqlEventQuery yang merepresentasikan kueri peristiwa dalam bentuk WQL; dan tentang ManagementDateTimeConverter yang menyediakan metode untuk mengonversi antara representasi tanggal/waktu dan interval waktu DMTF dan DateTime / TimeSpan milik CLR.  2 3

  12. Microsoft Learn, Requesting WMI Data on a 64-bit Platform. Tentang, di mana provider ada dalam versi 32-bit dan 64-bit, provider 32-bit secara default yang menjawab aplikasi 32-bit (termasuk skrip) dan provider 64-bit yang menjawab aplikasi 64-bit; tentang bisa meminta atau memaksa versi provider non-default lewat __ProviderArchitecture (32 atau 64) dan __RequiredArchitecture di konteks (dengan WBEM_E_PROVIDER_LOAD_FAILURE jika memaksa ke versi yang tidak ada); dan tentang contoh provider registri di mana klien 32-bit menerima data dari sisi HKLM\SOFTWARE\Wow6432Node.  2 3

  13. Microsoft Learn, winmgmt. Tentang /verifyrepository milik winmgmt.exe yang melakukan pemeriksaan konsistensi repositori WMI; tentang /salvagerepository yang melakukan pemeriksaan konsistensi dan, jika inkonsistensi terdeteksi, membangun ulang repositori sambil menggabungkan isi apa pun yang bisa dibaca; tentang /resetrepository yang mengembalikan repositori ke keadaannya pada instalasi OS awal; tentang repositori yang berfungsi sebagai basis data yang terdiri dari berkas di dalam folder Repository; dan tentang error yang muncul lewat WMI yang kadang berasal dari bagian OS lain, sehingga menghapus repositori sebagai tanggapan pertama harus dihindari karena bisa menyebabkan kerusakan pada sistem atau pada aplikasi yang terpasang.  2 3

Artikel terbaru dengan tag yang sama untuk mendalami topik-topik terdekat.

Halaman-halaman ini menempatkan topik dalam konteks layanan dan keputusan yang lebih luas.

Artikel ini berkaitan langsung dengan layanan berikut.

Pertanyaan yang sering diajukan

Pertanyaan yang sering muncul dalam konsultasi tentang topik artikel ini.

Apa perbedaan WMI dan CIM?
CIM adalah «model standar industri untuk merepresentasikan sasaran pengelolaan seperti sistem dan perangkat», yang disusun dan dipelihara DMTF (Distributed Management Task Force). WMI adalah implementasi Microsoft atas WBEM, inisiatif yang memakai standar itu, dan tertanam di Windows. Dengan kata lain, CIM adalah spesifikasinya dan WMI adalah implementasinya di Windows. Get-CimInstance di PowerShell dan Microsoft.Management.Infrastructure di C# memakai nama «CIM» karena mereka API yang mengikuti standar ini, tetapi mereka tersambung ke infrastruktur WMI yang sama. Untuk pengembangan sehari-hari, cukup dipahami sebagai «meng-query kelas WMI (Win32_* dan semacamnya) lewat API keluarga CIM».
Apakah Get-WmiObject sudah tidak bisa dipakai?
Masih jalan di Windows PowerShell 5.1, tetapi sejak PowerShell 6 (termasuk PowerShell 7 yang berlaku sekarang) cmdlet WMI v1 — Get-WmiObject, Invoke-WmiMethod, Register-WmiEvent, Set-WmiInstance, dan Remove-WmiObject — telah dihapus dan tidak bisa dijalankan. Fungsionalitas yang sama disediakan modul CimCmdlets (Get-CimInstance / Invoke-CimMethod / Register-CimIndicationEvent, dan semacamnya). Ketika menulis skrip baru, lebih aman menulisnya dengan cmdlet CIM meski akan dijalankan di 5.1. Dengan begitu, Anda tidak perlu menulis ulang bagian WMI ketika nanti migrasi ke PowerShell 7.
Untuk memakai WMI dari C#, haruskah System.Management atau Microsoft.Management.Infrastructure?
Keduanya khusus Windows, dan dari .NET yang berlaku sekarang Anda membawanya masuk sebagai paket NuGet. System.Management adalah API klasik: cukup menyerahkan WQL ke ManagementObjectSearcher, dan itu sudah cukup jika inti pekerjaannya mengambil informasi lokal. Ia juga menyertakan ManagementDateTimeConverter, yang mengonversi tanggal DMTF. Di sisi lain, Microsoft.Management.Infrastructure (API MI) berbagi sistem tipe yang sama (CimSession / CimInstance) dengan cmdlet CIM PowerShell, dan menangani kueri jarak jauh lewat WSMan, varian metode asinkron, serta langganan peristiwa (Subscribe) secara konsisten. Jika Anda akan membangun kueri dan pemantauan PC jarak jauh ke dalam produk sungguhan, memilih API MI adalah keputusan yang masuk akal.
Get-CimInstance tidak tersambung ke PC jarak jauh. Apa yang harus diperiksa?
Pertama periksa apakah WinRM sudah dikonfigurasi di mesin tujuan. Operasi CIM yang menentukan -ComputerName membuat sesi sementara lewat protokol WSMan (WinRM), jadi ia mengasumsikan layanan WinRM dan listener berjalan di tujuan. winrm quickconfig melakukan konfigurasi default (menyalakan layanan, membuat listener, dan menambah pengecualian firewall). Port default adalah 5985 untuk HTTP dan 5986 untuk HTTPS, jadi periksa juga firewall di sepanjang jalur. Di lingkungan workgroup, autentikasi bersama lewat Kerberos tidak tersedia, jadi Anda mungkin perlu mendaftarkan tujuan ke daftar TrustedHosts di sisi klien. Untuk tujuan yang sama sekali tidak bisa dikonfigurasi WinRM-nya, Anda bisa tersambung lewat DCOM memakai opsi yang dibuat dengan New-CimSessionOption -Protocol Dcom.
Mengapa tanggal WMI dikembalikan dalam format seperti «20260801100000.000000+540»?
Tanggal WMI disimpan dalam format string yang ditetapkan spesifikasi CIM DMTF (yyyymmddHHMMSS.mmmmmm±UUU, di mana nilai di ujung adalah offset dari UTC dalam menit). Jika Anda membaca nilai mentah dengan Get-WmiObject lama atau dengan System.Management, string ini dikembalikan apa adanya. Di C# (System.Management), ManagementDateTimeConverter menyediakan metode untuk mengonversi antara format DMTF dan DateTime / TimeSpan, jadi pakai itu alih-alih memotong-tempel string sendiri. Catat bahwa ketika Anda mengambil data lewat API keluarga CIM seperti Get-CimInstance, properti tanggal sudah dikembalikan terkonversi ke DateTime, sehingga Anda tidak pernah menemui masalah ini sejak awal.

Profil penulis

Halaman perkenalan penulis artikel.

Go Komura

Direktur KomuraSoft LLC

Berspesialisasi dalam pengembangan perangkat lunak Windows, konsultasi teknis, dan investigasi bug, terutama pada proyek dengan sistem yang sudah ada dan bug yang sulit direproduksi.

Kembali ke blog