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

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

Riwayat revisi (1 pembaruan, terakhir pada 31 Aug 2026)

Catatan perubahan yang dilakukan pada artikel ini. Jika versi sebelumnya telah diarsipkan, versi itu tetap dapat dibaca melalui tautan permanen dengan DOI.

Diterjemahkan ulang sebagai terjemahan lengkap dari naskah Jepang. Versi bahasa Indonesia sebelumnya adalah ringkasan yang hanya memindahkan sebagian naskah, sehingga bagian, tabel, gambar Mermaid, keterangan gambar, dan FAQ tidak ada. Semuanya dipulihkan sesuai naskah Jepang, dan klaim teknisnya sama dengan versi Jepang.
Publikasi pertama
Mengutip artikel ini(DOI (arsip terdaftar): 10.5281/zenodo.22175756)

DOI di bawah mengarah ke versi yang telah diarsipkan sebelumnya dan mungkin berbeda dari teks saat ini. Gunakan URL halaman ini untuk merujuk teks saat ini.

Go Komura (2026). Memakai WMI/CIM dari C# dan PowerShell — panduan praktis pengambilan informasi perangkat keras, pemantauan proses, dan kueri jarak jauh. KomuraSoft LLC. https://comcomponent.com/id/blog/wmi-cim-practical-guide/

DOI (arsip terdaftar)
10.5281/zenodo.22175756
DOI (versi terakhir yang didaftarkan)
10.5281/zenodo.22175757

“Saya ingin menampilkan nomor seri dan nama model PC di layar aplikasi bisnis.” “Saya ingin memantau ruang kosong disk server dan memberi peringatan.” “Saya ingin mendeteksi proses tertentu yang mulai berjalan.” “Saya ingin meng-query kondisi PC di lokasi jauh secara terpusat.” — permintaan semacam ini sudah jadi klasik saat membangun aplikasi bisnis dan alat pengelolaan Windows. Jawabannya yang sama klasiknya adalah WMI (Windows Management Instrumentation), atau dalam 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 kosong disk, mendeteksi proses yang mulai, dan meng-query PC jarak jauh adalah WMI, atau dalam nama standar CIMNomor seri dan nama modelWMI (nama standar: CIM)Memantau ruang kosong diskMendeteksi proses yang mulaiMeng-query PC jarak jauh

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

Yang merepotkan, informasi seputar WMI mencampur yang lama dan yang baru. Pencarian menampilkan artikel berumur sepuluh tahun yang memakai Get-WmiObject berdampingan dengan artikel yang memakai Get-CimInstance; di sisi C# ada dua jalur, System.Management dan Microsoft.Management.Infrastructure. Sulit membedakan mana cara menulis yang berlaku sekarang, dan mana yang masih berjalan tetapi tidak dipilih untuk kode baru. Faktanya, Get-WmiObject tidak ada di PowerShell 7, dan itu baru terasa ketika skrip internal yang ditulis untuk 5.1 dimigrasikan.

Artikel ini ditujukan kepada pengembang C#/PowerShell yang mengimplementasikan pengambilan informasi perangkat keras, pemantauan proses, dan kueri PC jarak jauh di aplikasi bisnis. Isinya menata, berdasarkan sumber primer per Agustus 2026, mulai dari pemahaman minimal struktur WMI/CIM, cmdlet CIM PowerShell, dua API C#, resep yang sering dipakai, jebakan kinerja, hak, dan 64bit, sampai cara menilai situasi di mana WMI tidak seharusnya dipakai.

1. Kesimpulan dulu

  • CIM adalah standar industri informasi pengelolaan yang disusun DMTF; WMI adalah implementasinya oleh Microsoft. API keluarga CIM di PowerShell dan C# adalah API generasi sekarang yang mengikuti standar ini, dan tujuan sambungannya adalah infrastruktur WMI yang sama.1
  • Yang berlaku di PowerShell adalah cmdlet CIM (Get-CimInstance / Invoke-CimMethod / Register-CimIndicationEvent). Cmdlet WMI lama (lima buah, termasuk Get-WmiObject) sudah dihapus sejak PowerShell 6 dan tidak berjalan di PowerShell 7.2
  • Namespace bawaan adalah root/CIMV2; kueri sehari-hari pada dasarnya mempersempit kelas Win32_* di situ dengan WQL.3
  • Kueri jarak jauh secara bawaan memakai WSMan (WinRM). -ComputerName membuat sesi WSMan sementara. Jika tujuan yang sama di-query berulang kali, memakai ulang sesi CIM (New-CimSession) adalah praktik mapan untuk kinerja; untuk mesin lama yang tidak bisa dikonfigurasi WinRM, ada opsi protokol DCOM.34
  • C# punya dua jalur: System.Management (ManagementObjectSearcher) dan Microsoft.Management.Infrastructure (CimSession). Keduanya khusus Windows, dan di .NET yang berlaku sekarang diimpor dari NuGet. Untuk kueri jarak jauh dan pemantauan yang serius, API MI — yang memakai sistem tipe yang sama dengan cmdlet CIM — lebih cocok.56
  • Deteksi proses yang mulai dilakukan dengan langganan peristiwa, bukan polling. Berlangganan Win32_ProcessStartTrace harus dijalankan dengan hak administrator.78
  • Jangan memakai SELECT * karena kebiasaan. Mempersempit data yang ditransfer dengan -Filter / -Property / -KeyOnly mencegah kira-kira setengah masalah kinerja WMI.3
  • WMI bukan solusi untuk segala hal. Untuk pemantauan kinerja berfrekuensi tinggi, membaca-menulis pengaturan aplikasi sendiri, atau panggilan fungsi OS sekali jalan, performance counter, registri, API Win32, atau cmdlet khusus lebih cocok (tabel keputusan di bagian 8).

Pada diagram, garis utuh menunjukkan relasi yang selalu berlaku dan garis putus-putus menunjukkan relasi bersyarat (syaratnya ada pada penjelasan masing-masing relasi di halaman rincian). Daftar lengkap relasi (total 26, beserta bukti dan tingkat kepastian) serta definisi konsep utama dikumpulkan di halaman rincian peta pengetahuan (dalam bahasa Jepang). Data: JSON-LD / Turtle

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

Pertama, hubungan istilahnya ditata sekali.

Istilah Apa adanya
CIM (Common Information Model) Model standar industri untuk merepresentasikan objek yang dikelola: sistem, aplikasi, jaringan, perangkat, dan semacamnya. Disusun dan dipelihara DMTF (Distributed Management Task Force)1
WBEM (Web-Based Enterprise Management) Inisiatif industri untuk membuat teknologi standar yang mengakses informasi pengelolaan di lingkungan perusahaan1
WMI Implementasi Microsoft atas WBEM. Merepresentasikan objek yang dikelola memakai standar CIM, dan tertanam di Windows1
MI (Windows Management Infrastructure) Generasi berikutnya dari WMI. Kompatibel penuh dengan WMI lama, dan banyak provider baru ditulis dengan 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 kompatibel penuh 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.

Empat potongan struktur yang perlu dipegang pengembang:

  • Namespace: hierarki yang mengelompokkan kelas. Untuk kueri sehari-hari hampir selalu root/CIMV2, yang juga bawaan cmdlet CIM.3 Yang lain termasuk root\default (provider registri, dan semacamnya).
  • Kelas: tipe objek yang dikelola, misalnya Win32_ComputerSystem (komputer itu sendiri), Win32_LogicalDisk (drive logis), Win32_Process (proses). Kelas khusus Windows yang mewarisi kelas standar CIM (seperti CIM_LogicalDisk) memakai awalan Win32_.9
  • Provider: komponen yang menyediakan substansi kelas. Saat di-query, provider menanyakan OS di tempat dan membangun nilainya.
  • WQL: bahasa kueri mirip SQL. Seperti SELECT Name, State FROM Win32_Service WHERE StartMode = 'Auto', kelas diperlakukan seperti tabel lalu dipersempit. Bahasa kueri bawaan cmdlet CIM juga WQL.3

“Membaca informasi OS dan perangkat keras lewat kelas dan bahasa kueri yang terpadu” — itulah nilai WMI. Sebaliknya, penulisan dan operasi terbatas pada sebagian kelas yang punya metode yang bisa dipanggil lewat Invoke-CimMethod; ini bukan mekanisme yang bisa melakukan apa pun.

Struktur kueri WMIKueri WQL diarahkan ke kelas Win32_* di dalam namespace root/CIMV2, provider yang menyediakan 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; nilainya dibuat di tempat.

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

3.1. Dasarnya Get-CimInstance

# Menentukan kelas (namespace bawaan root/CIMV2)
Get-CimInstance -ClassName Win32_OperatingSystem

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

# Ambil hanya properti yang dibutuhkan agar volume transfer berkurang
Get-CimInstance -ClassName Win32_Process -Property Name, ProcessId, CreationDate

# Pakai -Query jika WQL ditulis utuh
Get-CimInstance -Query "SELECT * FROM Win32_Process WHERE Name LIKE 'p%'"

-Filter adalah klausa WHERE milik WQL itu sendiri; -Property membatasi kolom yang diambil.3 Nilai kembalian adalah objek CimInstance, dan properti tanggal (CreationDate, LastBootUpTime, dan semacamnya) sudah dikonversi ke DateTime. Berbeda dari Get-WmiObject lama, objek yang diambil tidak membawa metode secara langsung, jadi pemanggilan metode diserahkan 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 diserahkan ke Invoke-CimMethod.

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

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

# Memeriksa definisi kelas (daftar 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 sudah dihapus. Fungsi 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 kelas dan memeriksa definisinya
Invoke-WmiMethod Invoke-CimMethod Argumen dilewatkan sebagai hashtable -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 berjalan di Windows PowerShell 5.1, jadi yang baru ditulis, termasuk jika masih dijalankan di 5.1, ditulis di sisi CIM agar tidak menyisakan biaya migrasi. Gambaran koeksistensi dan migrasi 5.1 dan 7 ada di “Perbedaan Windows PowerShell 5.1 dan PowerShell 7”.

Alasan menulis skrip baru dengan CIMSkrip yang ditulis dengan cmdlet WMI masih berjalan di 5.1 tetapi sudah dihapus sejak PowerShell 6 sehingga harus ditulis ulang saat migrasi, sedangkan cmdlet CIM juga berjalan di 5.1 jadi jika yang baru ditulis di sisi CIM tidak ada biaya migrasi tersisaCmdlet WMICmdlet CIMSkrip yang baru ditulisDitulis dengan yang mana?Berjalan di 5.1Juga berjalan di 5.1Sudah dihapus di PowerShell 7Ditulis ulang saat migrasiTidak menyisakan 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 bawaan) dan opsi DCOM

Cmdlet CIM, jika tujuan tidak ditentukan, tersambung ke WMI lokal lewat COM; jika -ComputerName ditentukan, mereka membuat sesi sementara lewat protokol WSMan (WinRM). Jika beberapa operasi dilakukan terhadap komputer yang sama, membuat sesi CIM lalu memakainya ulang lebih menguntungkan 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 yang sama?Sesi sementara WSManPakai ulang New-CimSessionDibuat di setiap kueriTujuan tanpa WinRMOpsi protokol DCOM

Gambar 6: Kueri jarak jauh secara bawaan memakai WSMan; beberapa operasi ke tujuan yang sama memakai ulang sesi CIM.

# Sekali jalan: -ComputerName (sesi sementara dibuat setiap kali)
Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName Server01, Server02

# 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 mesin lama yang tidak bisa dikonfigurasi WinRM, atau tujuan yang tidak bisa disambungkan lewat WSMan, protokol DCOM bisa dipilih.4

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

Prasyarat kueri jarak jauh:

  • WinRM sudah dikonfigurasi di tujuan. winrm quickconfig sekaligus menyetel layanan agar start otomatis, membuat listener HTTP (port bawaan 5985), dan mendaftarkan pengecualian firewall.10 Untuk sambungan HTTPS (port bawaan 5986) itu belum cukup: siapkan sertifikat server, lalu konfigurasi listener HTTPS secara terpisah, misalnya dengan winrm quickconfig -transport:https.10
  • Port terkait terbuka di firewall jalur. Praktik merancang dan mendaftarkan aturan inbound dibahas di artikel “Windows Firewall dan aplikasi bisnis”.
  • Autentikasi. Di lingkungan domain, autentikasi bersama memakai Kerberos. Di workgroup Kerberos tidak tersedia, jadi pendaftaran ke TrustedHosts di sisi klien kadang diperlukan. Daftarkan hanya yang benar-benar perlu.10
  • Hak. Pada konfigurasi bawaan, kueri dan operasi WMI jarak jauh pada dasarnya dijalankan dengan akun yang termasuk grup administrator di tujuan. Jika dibuka untuk pengguna biasa, izin akses perlu dikonfigurasi baik di WinRM maupun di namespace WMI.10
  • DCOM tidak punya port listen yang tetap (memakai port dinamis RPC), sehingga merancang lewat firewall menjadi lebih sulit. Untuk mekanisme yang baru dibangun, WSMan sebagai bawaan lebih aman.
Memeriksa prasyarat kueri jarak jauhDi tujuan, winrm quickconfig sekaligus menyetel start otomatis layanan, membuat listener HTTP, dan mendaftarkan pengecualian firewall; listener HTTPS dikonfigurasi terpisah setelah menyiapkan sertifikat; di lingkungan workgroup, pendaftaran ke TrustedHosts kadang diperlukanwinrm quickconfigLayanan start otomatisMembuat listener HTTP (5985)Pengecualian firewallListener HTTPS (5986)Siapkan sertifikat, konfigurasi terpisahLingkungan workgroupDaftarkan ke TrustedHosts

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

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

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

  System.Management Microsoft.Management.Infrastructure (API MI)
Instalasi Standar di .NET Framework. Di .NET yang berlaku sekarang, paket NuGet System.Management5 Paket NuGet Microsoft.Management.Infrastructure6
Kelas masuk ManagementObjectSearcher (kueri dengan menyerahkan WQL)5 CimSession (Create → QueryInstances / InvokeMethod / Subscribe)6
Sistem tipe ManagementObject / ManagementEventWatcher11 CimInstance / CimSession — tipe yang sama dengan cmdlet CIM3
Jarak jauh Berbasis DCOM Berbasis WSMan (sesi CIM). Ada varian asinkron (*Async)6
Cocok untuk Pengambilan informasi lokal. Mempertahankan kode yang sudah ada Memasukkan kueri jarak jauh dan pemantauan. Desain yang juga memakai PowerShell

5.1. System.Management: dasar ManagementObjectSearcher

Serahkan WQL sebagai string, lalu terima koleksi hasil dengan 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 pengindeks, jadi konfirmasikan tipe CIM di dokumentasi kelas (pada contoh ini FreeSpace / Size adalah uint649) lalu cast. Mengira itu int lalu mencast-nya hingga InvalidCastException adalah tersandung klasik yang pertama.

Jebakan pengambilan properti dan castProperti System.Management dikembalikan sebagai object lewat pengindeks, jadi tipe CIM harus dikonfirmasi di dokumentasi kelas sebelum di-cast; mengira int lalu mencast menimbulkan InvalidCastExceptionAmbil lewat pengindeksDikembalikan sebagai objectKonfirmasi tipe CIM di dokumentasiCast ke tipe yang benarMengira int lalu castInvalidCastException

Gambar 8: Properti dikembalikan sebagai object, jadi konfirmasikan tipe CIM sebelum cast.

5.2. API MI: dasar CimSession

CimSession menangani lokal dan jarak jauh dengan bentuk yang sama. Enumerasi, kueri, pemanggilan metode, langganan peristiwa, dan varian asinkronnya lengkap.6

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

// Lokal: CimSession.Create(null); jarak jauh: serahkan nama komputer
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");
}

Tipe yang ditangani sama dengan CimInstance yang dikembalikan cmdlet CIM PowerShell, jadi alur “coba di PowerShell, lalu salin ke C#” terhubung secara alami. Untuk merancang kolaborasi C# dan PowerShell itu sendiri, lihat juga “Cara menjalankan PowerShell dari C# dan menerima hasilnya sebagai objek”.

Alur mencoba di PowerShell lalu menyalin ke C#Cmdlet CIM PowerShell dan API MI C# menangani tipe CimInstance yang sama, jadi alur pengembangan mencoba di PowerShell lalu menyalin ke C# terhubung secara alamiCoba di PowerShellCmdlet CIMImplementasi penuh di C#API MITipe CimInstance yang samaPenyalinan terhubung secara alami

Gambar 9: Cmdlet CIM dan API MI menangani tipe CimInstance yang sama, jadi uji coba menuju implementasi penuh.

6. Resep yang sering dipakai

6.1. Tabel cepat kelas klasik

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

6.2. Klasik pengelolaan aset: nomor seri, nama model, ruang disk

# Informasi model dan nomor seri (untuk dicocokkan dengan daftar 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 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 adalah nilai “disk lokal”; removable (2), network drive (4), dan CD (5) dikeluarkan.9 Untuk pemantauan, cukup menggilir skrip yang sama ke setiap server lewat sesi CIM — itu sudah jadi fondasi pemantauan disk tanpa agen.

Fondasi pemantauan disk tanpa agenFilter DriveType 3 mengeluarkan removable, network drive, dan CD sehingga hanya disk lokal yang menjadi sasaran; skrip yang sama digilir ke setiap server lewat sesi CIM, sehingga fondasi pemantauan disk tanpa agen terbentukSkrip mengambil ruang kosongPersempit dengan DriveType = 3Keluarkan removable dan semacamnyaLewat sesi CIMGilirkan ke setiap serverPemantauan tanpa agen

Gambar 10: Fondasi pemantauan adalah menggilir skrip yang sudah dipersempit ke disk lokal ke setiap server lewat sesi CIM.

6.3. Mendeteksi proses yang mulai — langganan peristiwa

Jangan “mengambil Win32_Process secara berkala lalu melihat selisihnya” dengan polling; pakai langganan peristiwa. Cara termudah untuk proses yang mulai adalah berlangganan Win32_ProcessStartTrace (kelas peristiwa provider jejak kernel; punya ProcessName / ProcessID / ParentProcessID, dan semacamnya8).

# Jalankan di PowerShell dengan hak 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 berlaku selama sesi PowerShell tempat pendaftaran ini masih hidup, dan -Action dijalankan setiap kali proses mulai. Jika perintah pelepasan dijalankan sekaligus dalam satu napas, langganan hilang sebelum pemantauan sempat dimulai. Pelepasan dijalankan saat pemantauan diakhiri.

# Saat pemantauan diakhiri: lepaskan langganan
Unregister-Event -SourceIdentifier ProcessStarted

Register-CimIndicationEvent mendaftarkan langganan dengan nama kelas atau kueri peristiwa WQL, dan blok skrip -Action dijalankan setiap kali peristiwa masuk.7 Berlangganan kelas ini memerlukan hak administrator.7 Siapa yang boleh menerima peristiwa dikendalikan descriptor keamanan kelas peristiwa; sebagai pengguna biasa, akses ditolak.8

Alur langganan peristiwa proses yang mulaiSesi PowerShell dengan hak administrator mendaftarkan langganan lewat Register-CimIndicationEvent; setiap kali proses mulai, peristiwa masuk dan Action dijalankan; saat pemantauan diakhiri, Unregister-Event melepaskan langgananWMISesi PowerShellWMISesi PowerShellJalankan dengan hak administratorDaftar langganan dengan Register-CimIndicationEventPeristiwa masuk setiap kali proses mulaiJalankan -ActionLepaskan dengan Unregister-Event (saat pemantauan selesai)

Gambar 11: Langganan berlaku selama sesi pendaftaran masih hidup; pelepasan dilakukan saat pemantauan diakhiri.

Cara lain adalah peristiwa pembuatan instans generik (__InstanceCreationEvent) yang bisa dipakai pada kelas mana pun. Di sini WMI melakukan polling pada interval WITHIN lalu mengubah selisih menjadi peristiwa, jadi trade-off antara interval deteksi dan beban diputuskan sendiri.

Dua cara langganan untuk mendeteksi proses yang mulaiWin32_ProcessStartTrace berlangganan kelas peristiwa provider jejak kernel; __InstanceCreationEvent generik membuat WMI melakukan polling pada interval WITHIN lalu mengubah selisih menjadi peristiwa, sehingga trade-off interval deteksi dan beban diputuskan sendiriMendeteksi proses yang mulaiWin32_ProcessStartTrace__InstanceCreationEventLangganan jejak kernelPolling pada interval WITHINTrade-off interval dan beban

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

# Pantau instans baru Win32_Process dengan polling interval 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 mengisi peran yang sama.11

using System.Management;

// Di 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();
// Saat pemantauan selesai, jangan lupa watcher.Stop() dan Dispose

Jika dimasukkan ke pemantauan yang selalu hidup, rancang juga pendaftaran ulang ketika langganan putus (saat layanan di-restart, saat error). Desain “memeriksa dan menampilkan keadaan”, termasuk pemantauan perangkat, dibahas di “Praktik terbaik memeriksa dan menampilkan keadaan perangkat eksternal”.

Siklus hidup langganan pemantauan yang selalu hidupPada pemantauan yang selalu hidup, keadaan sedang berlangganan bisa putus karena layanan di-restart atau error, jadi rancang deteksi putusnya lalu daftar ulang hingga kembali berlanggananLayanan di-restart / errorSedang berlanggananLangganan putusDaftar ulang

Gambar 13: Pada pemantauan yang selalu hidup, rancang juga daftar ulang saat langganan putus agar kembali ke keadaan berlangganan.

7. Jebakan — kinerja, hak, 64bit, repositori, tanggal

7.1. SELECT * dan polling yang berlebihan

Kueri WMI adalah pemrosesan “provider membuat nilai di tempat”, bukan gratis. Dua antipola klasiknya:

  • Memakai SELECT * karena kebiasaan. Mengambil semua properti semua baris Win32_Process memperbesar kerja provider dan transfer jaringan (saat jarak jauh). Persempit baris dengan -Filter, kolom dengan -Property, dan jika yang dibutuhkan hanya kunci untuk operasi berikutnya, pakai -KeyOnly. Semuanya disediakan resmi “untuk mengecilkan ukuran objek dan lalu lintas jaringan”.3
  • Polling berperiode pendek. Desain seperti “setiap 1 detik Get-CimInstance Win32_Process” diganti dengan langganan peristiwa di bagian 6.3. Jika tetap memakai bentuk polling (WITHIN), perlebar interval sampai cukup untuk kebutuhan.

Mengulang -ComputerName satu mesin demi satu ke tujuan jarak jauh juga boros. Sesi sementara dibuat di setiap kueri, jadi beberapa operasi memakai ulang sesi CIM.3

Antipola kinerja dan penggantinyaKebiasaan SELECT asterisk dipersempit baris dan kolomnya dengan Filter dan Property, kunci saja memakai KeyOnly; polling berperiode pendek diganti langganan peristiwa; pengulangan ComputerName satu mesin diganti memakai ulang sesi CIMKebiasaan SELECT *Persempit dengan Filter dan PropertyJika hanya kunci, KeyOnlyPolling berperiode pendekGanti dengan langganan peristiwaComputerName satu mesin demi satuPakai ulang sesi CIM

Gambar 14: Mempersempit baris, kolom, dan kunci, plus mengganti ke langganan peristiwa, mencegah kira-kira setengah masalah kinerja WMI.

7.2. Hak untuk langganan peristiwa

Seperti di bagian 6.3, berlangganan keluarga Win32_ProcessStartTrace mensyaratkan hak administrator.7 “Berjalan di mesin pengembangan (dijalankan sebagai administrator), tetapi pemantauan tidak jalan di lingkungan pengguna biasa di situs pelanggan” adalah kecelakaan klasik, sejajar dengan dialog notifikasi firewall. Jika pemantauan dimasukkan ke aplikasi bisnis yang berjalan sebagai pengguna biasa, pertimbangkan memisahkan bagian pemantauan ke layanan Windows (LocalSystem, dan semacamnya) dan menghubungkannya ke aplikasi lewat komunikasi antarproses.

Konfigurasi pemantauan di lingkungan pengguna biasaLangganan yang mensyaratkan hak administrator dipisah dari aplikasi yang berjalan sebagai pengguna biasa, bagian pemantauan dipindah ke layanan Windows yang dijalankan sebagai LocalSystem dan semacamnya, lalu dihubungkan ke aplikasi lewat komunikasi antarprosesKomunikasi antarprosesLayanan Windows untuk pemantauanBerlangganan jejak startDijalankan sebagai LocalSystem dan semacamnyaAplikasi (pengguna biasa)

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

7.3. 32bit/64bit dan provider

Di Windows 64bit, sebagian provider punya edisi 32bit dan 64bit; secara bawaan sisi yang cocok dengan jumlah bit aplikasi pemanggil yang menjawab.12 Contoh khas adalah provider registri (StdRegProv) di root\default: dibaca dari aplikasi 32bit, yang dikembalikan adalah nilai sisi Wow6432Node (tampilan 32bit).12 Jika “nilai registri yang dibaca WMI berbeda dari yang terlihat di regedit”, curigai ini dulu. Jika tampilan sisi sebaliknya yang dibutuhkan, minta secara eksplisit dengan __ProviderArchitecture (dan __RequiredArchitecture jika harus dipaksa) di konteks saat menyambung.12 Gambaran masalah jumlah bit secara keseluruhan juga dibahas di “Memanggil API Win32 dengan aman dari C# — panduan praktis P/Invoke”.

Pemilihan provider di lingkungan 64bitSecara bawaan provider yang cocok dengan jumlah bit aplikasi pemanggil yang menjawab; kueri registri aplikasi 32bit menerima nilai sisi Wow6432Node, tetapi tampilan sisi sebaliknya bisa diminta secara eksplisit dengan __ProviderArchitecture32bit64bitJumlah bit pemanggil?Provider 32bit yang menjawabProvider 64bit yang menjawabRegistri: nilai sisi Wow6432NodeMenentukan __ProviderArchitectureMinta tampilan sisi sebaliknya secara eksplisit

Gambar 16: Secara bawaan sisi yang cocok dengan jumlah bit pemanggil yang menjawab, jadi aplikasi 32bit membaca sisi Wow6432Node.

7.4. Gejala dan penanganan repositori WMI yang rusak

Definisi kelas WMI disimpan di repositori (bukan satu berkas; kumpulan berkas di folder Repository berfungsi sebagai basis data13). Jika terjadi inkonsistensi, error seperti “kelas yang seharusnya ada tidak ditemukan” atau “namespace tidak valid” mulai muncul meskipun aplikasi tidak diubah. Untuk menelusuri dan memperbaiki, pakai winmgmt.exe.13

rem Pemeriksaan konsistensi (jika hasilnya inconsistent, ada inkonsistensi)
winmgmt /verifyrepository

rem Pemeriksaan konsistensi + bangun ulang jika inkonsisten (isi yang bisa dibaca digabung)
winmgmt /salvagerepository

Yang perlu diingat: jangan menjadikan penghapusan atau inisialisasi repositori sebagai langkah pertama. Error yang muncul lewat WMI kadang berasal dari bagian OS lain, dan Microsoft menyatakan secara tegas bahwa menjadikan penghapusan repositori sebagai penanganan pertama “bisa merusak sistem atau aplikasi yang terpasang”.13 Ikuti urutan konfirmasi dengan /verifyrepository → perbaikan dengan /salvagerepository.

Langkah menelusuri inkonsistensi repositori WMIJika muncul error seperti kelas tidak ditemukan, periksa konsistensi dengan verifyrepository milik winmgmt; jika inkonsisten, bangun ulang dengan salvagerepository; jangan jadikan penghapusan atau inisialisasi repositori sebagai langkah pertamaYaTidakError seperti kelas tidak ditemukanwinmgmt /verifyrepositoryHasilnya inconsistent?winmgmt /salvagerepositoryCurigai penyebab di bagian OS lainIsi yang bisa dibaca digabungMenghapus atau menginisialisasi repositoriJangan jadi langkah pertama

Gambar 17: Ikuti urutan verify lalu salvage; jangan jadikan penghapusan sebagai langkah pertama.

7.5. Konversi format tanggal DMTF

Tanggal WMI disimpan sebagai string format DMTF spesifikasi CIM yyyymmddHHMMSS.mmmmmm±UUU (angka di ujung adalah offset dari UTC dalam menit; contoh: 20260801100000.000000+540). Jangan potong-tempel nilai mentah sebagai string; pakai API konversi.

  • C# (System.Management): ManagementDateTimeConverter menyediakan konversi dua arah antara format DMTF dan DateTime / TimeSpan.11
  • API keluarga CIM (Get-CimInstance / API MI): properti tanggal sudah dikembalikan sebagai DateTime, jadi masalah ini tidak muncul. (Get-CimInstance Win32_OperatingSystem).LastBootUpTime bisa dipakai langsung sebagai DateTime dalam perhitungan.
Menangani format tanggal DMTFTanggal WMI disimpan sebagai string format DMTF; jika nilai mentah dibaca dengan System.Management, konversi dengan ManagementDateTimeConverter; API keluarga CIM mengembalikan DateTime yang sudah dikonversi; jangan potong-tempel string sendiriSystem.ManagementAPI keluarga CIMString format DMTFDiambil dengan API mana?ManagementDateTimeConverterDikembalikan sudah sebagai DateTimeKonversi ke DateTime / TimeSpanPotong-tempel string sendiriJangan dipakai

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

8. Situasi di mana WMI tidak seharusnya dipakai — tabel keputusan sarana

WMI unggul sebagai “pintu baca yang terpadu”, tetapi tidak selalu pilihan terbaik. Berikut patokan pemakaian di lapangan.

Yang ingin dilakukan Sarana yang cocok Alasan tidak memilih WMI
Mengambil informasi perangkat keras dan konfigurasi OS, kueri jarak jauh tanpa agen WMI/CIM Di sinilah WMI unggul. Lebih terpadu daripada mengetuk API khusus satu per satu
Membaca dan menulis pengaturan aplikasi sendiri Baca registri langsung (Microsoft.Win32.Registry) atau berkas konfigurasi Operasi registri lewat WMI adalah jalan memutar, dan ikut menanggung masalah jumlah bit di bagian 7.3
Pemantauan kinerja berfrekuensi tinggi dan berkelanjutan, misalnya pemakaian CPU Performance counter (System.Diagnostics.PerformanceCounter dan semacamnya) Counter memang dibuat untuk itu. Polling WMI berperiode pendek kalah di beban dan ketepatan
Panggilan fungsi OS sekali jalan, atau pemrosesan yang butuh latensi rendah API Win32 (P/Invoke) WMI membawa overhead karena melewati COM/provider
Enumerasi dan operasi proses lokal selama hak proses sendiri cukup System.Diagnostics.Process Selesai di pustaka standar, ketergantungan berkurang
Mengonfigurasi fitur pengelolaan Windows seperti firewall atau jaringan Cmdlet berbasis CIM khusus seperti Get-NetFirewallRule Kumpulan cmdlet yang ditata per keperluan lebih akurat dan lebih aman daripada mencari kelas WMI mentah
Mendeteksi perubahan berkas atau folder FileSystemWatcher Jangan bawa WMI ke wilayah yang sudah punya API khusus

Sumbu keputusannya sederhana: di wilayah yang sudah punya mekanisme khusus, pakai mekanisme khusus itu; pakai WMI/CIM untuk kueri lintas dan kueri jarak jauh. Get-NetFirewallRule di baris terakhir, secara internal, adalah kumpulan cmdlet yang dibangun di atas CIM — bentuk “menikmati manfaatnya tanpa menyentuh WMI/CIM secara langsung”.

Sumbu keputusan saranaDi 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 kueri jarak jauhCmdlet berbasis CIM khususBentuk yang hanya 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, WMI adalah implementasinya oleh Microsoft. Cmdlet CIM PowerShell maupun API MI C# adalah pintu 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 skrip baru ditulis di sisi CIM meski masih untuk 5.1.
  • Kueri jarak jauh secara bawaan memakai WSMan (WinRM); beberapa operasi memakai ulang sesi CIM. Untuk tujuan tanpa WinRM, opsi DCOM adalah jalan keluar.
  • Di C#, pilih antara System.Management (ringan, berorientasi lokal) dan Microsoft.Management.Infrastructure (berorientasi jarak jauh dan pemantauan, sistem tipe sama dengan cmdlet CIM). Keduanya paket NuGet khusus Windows.
  • Pemantauan proses memakai langganan peristiwa, bukan polling. Berlangganan Win32_ProcessStartTrace memerlukan hak administrator.
  • Hindari SELECT * dan polling berperiode pendek; persempit dengan -Filter / -Property / -KeyOnly. Ingat bahwa kueri dari proses 32bit mengarah ke provider 32bit, tanggal DMTF memakai API konversi, dan repositori yang rusak ditangani dengan urutan verify → salvage, bukan penghapusan.
  • Jangan bawa WMI ke wilayah yang sudah punya mekanisme khusus (pengaturan, performance counter, panggilan API sekali jalan). Pakai WMI/CIM untuk kueri lintas dan kueri jarak jauh — itu satu kalimat tentang kapan memakainya.

Artikel terkait

Area konsultasi terkait

Di KomuraSoft, kami menangani pemasukan pengambilan informasi perangkat keras, pemantauan proses, dan kueri PC jarak jauh dengan WMI/CIM ke aplikasi bisnis, migrasi skrip internal berbasis Get-WmiObject ke cmdlet CIM, serta penyelidikan penyebab jenis “berjalan di mesin pengembangan, tetapi error hak di situs pelanggan”. Konsultasi bisa dijalankan sebagai satu rangkaian, dari uji coba di PowerShell sampai implementasi penuh di C#.

Tautan referensi

  1. Microsoft Learn, About WMI. Tentang WMI sebagai implementasi Microsoft atas WBEM (inisiatif industri yang mengembangkan teknologi standar untuk mengakses informasi pengelolaan di lingkungan perusahaan); tentang merepresentasikan objek yang dikelola memakai standar industri CIM (Common Information Model) yang disusun dan dipelihara DMTF (Distributed Management Task Force); tentang MI (Windows Management Infrastructure) generasi berikutnya yang kompatibel penuh dengan WMI lama; dan tentang koneksi WMI jarak jauh yang dilakukan lewat 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 dihapus dari PowerShell, dan tentang cmdlet modul CimCmdlets (WMI v2) yang menyediakan fungsi 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 jika ComputerName maupun CimSession tidak ditentukan, dan membuat sesi sementara protokol WsMan jika -ComputerName ditentukan; tentang koneksi lewat sesi CIM yang disarankan demi kinerja untuk beberapa operasi terhadap komputer yang sama; tentang -Filter sebagai klausa where WQL/CQL tanpa kata kunci WHERE; tentang -Property dan -KeyOnly yang mengurangi ukuran objek dan lalu lintas jaringan; tentang namespace bawaan root/CIMV2 dan bahasa kueri bawaan (-QueryDialect) WQL; tentang keluaran Microsoft.Management.Infrastructure.CimInstance; tentang contoh pemanggilan GetOwner yang dipadukan 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 bisa diisi 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 bawaan sesi DCOM yang Impersonate. ↩ ↩2

  5. Microsoft Learn, ManagementObjectSearcher Class (System.Management). Tentang kelas pintu masuk paling umum untuk mengambil informasi pengelolaan, yang mengambil koleksi objek pengelolaan berdasarkan kueri WQL yang ditentukan; tentang menerima ObjectQuery dan ManagementScope (namespace WMI) lalu 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 pembuatan sesi dengan Create(computerName); tentang menjalankan kueri dengan QueryInstances(namespace, queryDialect, query); dan tentang EnumerateInstances / GetInstance / InvokeMethod / Subscribe beserta masing-masing varian asinkron (*Async), sambil mengimplementasikan IDisposable. ↩ ↩2 ↩3 ↩4 ↩5

  7. Microsoft Learn, Register-CimIndicationEvent (CimCmdlets). Tentang berlangganan indication (peristiwa) dengan nama kelas atau ekspresi kueri dan menamai langganan dengan -SourceIdentifier; tentang contoh berlangganan Win32_ProcessStartTrace beserta catatan bahwa pelaksanaannya memerlukan PowerShell sebagai administrator; tentang contoh mereferensikan ProcessName / ProcessId dari $Event.SourceEventArgs.NewEvent di dalam blok skrip -Action; tentang sesi sementara WsMan jika -ComputerName ditentukan, dan koneksi COM lokal jika tidak; dan tentang pelepasan langganan dengan Unregister-Event. ↩ ↩2 ↩3 ↩4

  8. Microsoft Learn, Win32_ProcessStartTrace class. Tentang kelas peristiwa yang menandai dimulainya proses baru, dengan properti ProcessName / ProcessID / ParentProcessID / SessionID / Sid dan semacamnya; tentang properti SECURITY_DESCRIPTOR sebagai descriptor yang dipakai provider peristiwa untuk menentukan pengguna mana yang boleh 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 semacamnya); tentang FreeSpace / Size sebagai nilai byte uint64; tentang DeviceID sebagai kunci; dan tentang contoh kueri VBScript / C# yang mempersempit dengan DriveType = 3. ↩ ↩2 ↩3 ↩4

  10. Microsoft Learn, Installation and configuration for Windows Remote Management. Tentang listener WinRM yang secara bawaan tidak dikonfigurasi sehingga 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 bawaan WinRM 2.0 yaitu HTTP 5985 / HTTPS 5986; tentang menyetel TrustedHosts sesempit mungkin jika autentikasi bersama (Kerberos) tidak bisa dibentuk, misalnya di workgroup; dan tentang descriptor keamanan bawaan (RootSDDL) yang mengontrol akses jarak jauh ke listener, plus konfigurasi tambahan jika pengguna non-administrator diizinkan memakai plug-in WMI. ↩ ↩2 ↩3 ↩4

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

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

  13. Microsoft Learn, winmgmt. Tentang /verifyrepository milik winmgmt.exe yang memeriksa konsistensi repositori WMI; tentang /salvagerepository yang memeriksa konsistensi lalu, jika inkonsistensi terdeteksi, membangun ulang repositori sambil menggabungkan isi yang bisa dibaca; tentang /resetrepository yang mengembalikan ke keadaan saat instalasi OS awal; tentang repositori yang berfungsi sebagai basis data dari kumpulan berkas di folder Repository; dan tentang error lewat WMI yang kadang berasal dari bagian OS lain, sehingga penghapusan repositori sebagai penanganan pertama tidak boleh dilakukan karena bisa merusak sistem atau 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 objek yang dikelola — sistem, perangkat, dan semacamnya — yang disusun dan dipelihara DMTF (Distributed Management Task Force). WMI adalah implementasi Microsoft atas inisiatif WBEM yang memakai standar itu, dan sudah tertanam di Windows. Singkatnya, CIM adalah spesifikasinya, WMI adalah implementasinya di Windows. Get-CimInstance di PowerShell dan Microsoft.Management.Infrastructure di C# memakai nama CIM karena API-nya mengikuti standar ini; tujuan sambungannya tetap infrastruktur WMI yang sama. Dalam pekerjaan sehari-hari, cukup dipahami sebagai meng-query kelas WMI (Win32_* dan semacamnya) lewat API keluarga CIM.
Apakah Get-WmiObject sudah tidak bisa dipakai?
Masih berjalan di Windows PowerShell 5.1, tetapi sejak PowerShell 6 (termasuk PowerShell 7 yang dipakai sekarang) lima cmdlet WMI v1 — Get-WmiObject, Invoke-WmiMethod, Register-WmiEvent, Set-WmiInstance, dan Remove-WmiObject — sudah dihapus dan tidak bisa dijalankan. Fungsi yang sama disediakan modul CimCmdlets (Get-CimInstance / Invoke-CimMethod / Register-CimIndicationEvent, dan semacamnya). Skrip baru lebih aman ditulis dengan cmdlet CIM, termasuk jika masih dijalankan di 5.1. Dengan begitu, bagian WMI tidak perlu ditulis ulang saat migrasi ke PowerShell 7.
Untuk memakai WMI dari C#, pilih System.Management atau Microsoft.Management.Infrastructure?
Keduanya khusus Windows, dan dari .NET yang berlaku sekarang diimpor sebagai paket NuGet. System.Management adalah API klasik: cukup menyerahkan WQL ke ManagementObjectSearcher, dan itu sudah cukup jika intinya mengambil informasi lokal. ManagementDateTimeConverter untuk mengonversi tanggal DMTF juga ada di sini. Microsoft.Management.Infrastructure (API MI) memakai sistem tipe yang sama (CimSession / CimInstance) dengan cmdlet CIM PowerShell, dan menangani kueri jarak jauh lewat WSMan, metode asinkron, serta langganan peristiwa (Subscribe) dalam satu rangkaian. Jika kueri dan pemantauan PC jarak jauh akan dimasukkan ke produk secara serius, API MI adalah pilihan yang masuk akal.
Get-CimInstance tidak tersambung ke PC jarak jauh. Apa yang harus diperiksa?
Pertama, pastikan WinRM sudah dikonfigurasi di mesin tujuan. Operasi CIM dengan -ComputerName membuat sesi sementara lewat protokol WSMan (WinRM), jadi layanan WinRM dan listener harus berjalan di tujuan. winrm quickconfig menerapkan konfigurasi bawaan (menyalakan layanan, membuat listener, dan menambah pengecualian firewall). Port bawaan adalah 5985 untuk HTTP dan 5986 untuk HTTPS; periksa juga firewall di sepanjang jalur. Di lingkungan workgroup, autentikasi bersama Kerberos tidak tersedia, jadi tujuan mungkin perlu didaftarkan ke TrustedHosts di sisi klien. Jika WinRM sama sekali tidak bisa dikonfigurasi di tujuan, sambungkan lewat DCOM dengan opsi dari New-CimSessionOption -Protocol Dcom.
Mengapa tanggal WMI dikembalikan dalam format seperti 20260801100000.000000+540?
Tanggal WMI disimpan sebagai string menurut spesifikasi CIM DMTF (yyyymmddHHMMSS.mmmmmm±UUU; angka di ujung adalah offset dari UTC dalam menit). Jika nilai mentah dibaca dengan Get-WmiObject lama atau System.Management, string itu dikembalikan apa adanya. Di C# (System.Management), ManagementDateTimeConverter menyediakan konversi antara format DMTF dan DateTime / TimeSpan; pakai itu, jangan potong-tempel string sendiri. Jika data diambil lewat API keluarga CIM seperti Get-CimInstance, properti tanggal sudah dikembalikan sebagai DateTime, jadi masalah ini tidak muncul.

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