Memakai WMI/CIM dari C# dan PowerShell — panduan praktis pengambilan info perangkat keras, pemantauan proses, dan kueri jarak jauh
· Go Komura · 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).
flowchart TB
accTitle: Permintaan klasik dan WMI/CIM
accDescr: Jawaban 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 CIM
r1["Nomor seri dan model"] --> ans["WMI (nama standar: CIM)"]
r2["Memantau ruang disk kosong"] --> ans
r3["Mendeteksi proses yang start"] --> ans
r4["Meng-query PC jarak jauh"] --> ans
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
-ComputerNamemembuat 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_ProcessStartTraceharus dijalankan dengan hak administrator.78 - Jangan memakai
SELECT *karena kebiasaan. Mempersempit apa yang ditransfer dengan-Filter/-Property/-KeyOnlymencegah 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 |
flowchart TB
accTitle: Hubungan standar CIM dan implementasi WMI
accDescr: Standar 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 sama
dmtf["Disusun dan dipelihara DMTF"] --> cim["CIM (model standar industri)"]
wbem["WBEM (inisiatif industri)"] --> wmi["WMI (implementasi Microsoft)"]
cim --> wmi
wmi -.-> mi["MI (generasi berikutnya, kompatibel penuh)"]
api["API keluarga CIM (PowerShell / C#)"] --> wmi
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), atauWin32_Process(proses). Kelas khusus Windows yang mewarisi kelas standar CIM (sepertiCIM_LogicalDisk) membawa prefiksWin32_.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.
flowchart TB
accTitle: Struktur kueri WMI
accDescr: Kueri WQL diarahkan ke kelas Win32_* di dalam namespace root/CIMV2, provider yang memasok substansi kelas menanyakan OS di tempat untuk membuat nilai, lalu hasil dikembalikan
wql["Kueri dengan WQL"] --> ns["Namespace root/CIMV2"]
ns --> cls["Kelas Win32_*"]
cls --> prov["Provider"]
prov --> osq["Menanyakan OS di tempat"]
osq --> res["Mengembalikan 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.
flowchart TB
accTitle: Pemanggilan metode CimInstance
accDescr: CimInstance 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-CimMethod
gci["Get-CimInstance"] --> inst["Objek CimInstance"]
inst -.-> dt["Tanggal sudah DateTime"]
inst -.-> nom["Tidak membawa metode langsung"]
inst --> icm["Serahkan ke Invoke-CimMethod"]
icm --> call["Pemanggilan 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».
flowchart TB
accTitle: Alasan menulis skrip baru dengan CIM
accDescr: Skrip 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 tersisa
new["Skrip yang baru ditulis"] --> q1{"Ditulis dengan yang mana?"}
q1 -->|Cmdlet WMI| old["Jalan di 5.1"]
q1 -->|Cmdlet CIM| cur["Juga jalan di 5.1"]
old --> del["Sudah dihapus di PowerShell 7"]
del --> rew["Ditulis ulang saat migrasi"]
cur --> norew["Tidak 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
flowchart TB
accTitle: Memilih cara koneksi CIM
accDescr: Tanpa 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 DCOM
exec["Menjalankan cmdlet CIM"] --> q1{"ComputerName ditentukan?"}
q1 -->|Tidak| local["Koneksi COM ke WMI lokal"]
q1 -->|Ya| q2{"Beberapa operasi ke tujuan sama?"}
q2 -->|Sekali| temp["Sesi sementara WSMan"]
q2 -->|Beberapa| sess["Pakai ulang New-CimSession"]
temp -.-> cost["Dibuat di setiap kueri"]
nowinrm["Tujuan tanpa WinRM"] -.-> dcom["Opsi 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 quickconfigmenyetel 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 sepertiwinrm 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
TrustedHostsdi 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.
flowchart TB
accTitle: Memeriksa prasyarat kueri jarak jauh
accDescr: Di 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 TrustedHosts
qc["winrm quickconfig"] --> svc["Layanan start otomatis"]
qc --> lis["Membuat listener HTTP (5985)"]
qc --> fw["Pengecualian firewall"]
lis ~~~ https["Listener HTTPS (5986)"]
https -.-> cert["Siapkan sertifikat, konfigurasi terpisah"]
fw ~~~ wg["Lingkungan workgroup"]
wg -.-> th["Daftar 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 / CimSession — tipe 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.
flowchart TB
accTitle: Jebakan mengambil properti dan cast
accDescr: Properti 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 InvalidCastException
idx["Ambil lewat indexer"] --> obj["Dikembalikan sebagai object"]
obj --> chk["Periksa tipe CIM di dokumen"]
chk --> cast["Cast ke tipe yang benar"]
obj -.-> wrong["Dikira int lalu di-cast"]
wrong -.-> ex["InvalidCastException"]
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».
flowchart TB
accTitle: Alur coba di PowerShell lalu salin ke C#
accDescr: 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 alami
trial["Coba di PowerShell"] --> gci["Cmdlet CIM"]
impl["Implementasi C#"] --> mi["API MI"]
gci --> ci["Tipe CimInstance yang sama"]
mi --> ci
ci -.-> flow["Penyalinan 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.
flowchart TB
accTitle: Fondasi pemantauan disk tanpa agen
accDescr: Filter 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 agen
scr["Skrip ruang kosong"] --> flt["Filter DriveType = 3"]
flt -.-> exc["Kecualikan removable dll."]
scr --> ses["Lewat sesi CIM"]
ses --> srvs["Jalankan ke setiap server"]
srvs --> mon["Pemantauan 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
sequenceDiagram
accTitle: Alur langganan peristiwa proses start
accDescr: Di 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 selesai
participant ps as Sesi PowerShell
participant wmi as WMI
ps->>wmi: Daftar langganan dengan Register-CimIndicationEvent
Note over ps: Jalankan sebagai administrator
wmi-->>ps: Peristiwa tiba setiap proses start
ps->>ps: Jalankan -Action
ps->>wmi: Batalkan 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.
flowchart TB
accTitle: Dua cara langganan deteksi proses start
accDescr: Win32_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 beban
goal["Deteksi proses yang start"] --> t1["Win32_ProcessStartTrace"]
goal --> t2["__InstanceCreationEvent"]
t1 -.-> k1["Langganan jejak kernel"]
t2 -.-> w1["Polling interval WITHIN"]
w1 -.-> tr["Trade-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».
stateDiagram-v2
accTitle: Siklus hidup langganan pemantauan menetap
accDescr: Dalam pemantauan menetap, keadaan berlangganan aktif bisa putus karena restart layanan atau error, jadi desain harus mencakup deteksi putus, daftar ulang, dan kembali ke berlangganan aktif
s1: Berlangganan aktif
s2: Langganan terputus
s3: Daftar ulang
[*] --> s1
s1 --> s2: Restart layanan / error
s2 --> s3
s3 --> s1
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 barisWin32_Processmenggembungkan pekerjaan provider dan transfer jaringan (ketika jarak jauh) sesuai itu. Persempit baris dengan-Filter, persempit kolom dengan-Property, dan pakai-KeyOnlyjika 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_Processsetiap 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
flowchart TB
accTitle: Antipola kinerja dan penggantinya
accDescr: Kebiasaan 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 CIM
a1["Kebiasaan SELECT *"] --> f1["Persempit Filter dan Property"]
f1 -.-> f2["Hanya kunci: KeyOnly"]
a2["Polling interval pendek"] --> f3["Ganti langganan peristiwa"]
a3["ComputerName satu per satu"] --> f4["Pakai 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.
flowchart TB
accTitle: Konfigurasi pemantauan di lingkungan pengguna biasa
accDescr: Langganan 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 antarproses
svcm["Layanan Windows pemantauan"] --> subm["Langganan jejak start"]
svcm -.-> lsm["Jalan sebagai LocalSystem dll."]
appm["Aplikasi (pengguna biasa)"] ---|Komunikasi antarproses| svcm
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».
flowchart TB
accTitle: Pemilihan provider di lingkungan 64-bit
accDescr: Secara 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 __ProviderArchitecture
q1{"Bitness pemanggil?"} -->|32-bit| p32["Provider 32-bit menjawab"]
q1 -->|64-bit| p64["Provider 64-bit menjawab"]
p32 -.-> wow["Registri: nilai Wow6432Node"]
ctx["__ProviderArchitecture"] -.-> ov["Minta 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.
flowchart TB
accTitle: Langkah diagnosis inkonsistensi repositori WMI
accDescr: Jika 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 pertama
sym["Error kelas tidak ditemukan dll."] --> verify["winmgmt /verifyrepository"]
verify --> q1{"Hasilnya inconsistent?"}
q1 -->|Ya| salvage["winmgmt /salvagerepository"]
q1 -->|Tidak| other["Curigai bagian OS lain"]
salvage -.-> merge["Isi yang terbaca digabung"]
del["Hapus atau inisialisasi repositori"] -.-> ng["Bukan 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):
ManagementDateTimeConvertermenyediakan konversi antara format DMTF danDateTime/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).LastBootUpTimebisa dipakai langsung sebagaiDateTimedalam perhitungan.
flowchart TB
accTitle: Penanganan format tanggal DMTF
accDescr: Tanggal 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 sendiri
dmtf["String format DMTF"] --> q1{"Diambil lewat API mana?"}
q1 -->|System.Management| conv["ManagementDateTimeConverter"]
q1 -->|API keluarga CIM| done["Sudah DateTime terkonversi"]
conv --> dtv["Konversi ke DateTime / TimeSpan"]
cut["Potong-tempel string sendiri"] -.-> ng["Jangan 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.»
flowchart TB
accTitle: Sumbu keputusan alat
accDescr: Di 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 langsung
q1{"Ada mekanisme khusus?"} -->|Ada| ded["Pakai mekanisme khusus"]
q1 -->|Tidak| wmi["Pakai WMI / CIM"]
wmi -.-> use["Kueri lintas dan jarak jauh"]
cmd["Cmdlet berbasis CIM khusus"] -.-> ben["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, 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
- Cara menjalankan PowerShell dari C# (CSharp) dan menerima hasilnya sebagai objek
- Resep perintah PowerShell praktis — menambah alat kecil yang dipakai setiap hari
- Perbedaan Windows PowerShell 5.1 dan PowerShell 7 — panduan praktis migrasi skrip internal
- Praktik terbaik memeriksa dan menampilkan keadaan perangkat eksternal - merancang di luar sekadar «Tersambung»
- Memanggil API Win32 dengan aman dari C# — panduan praktis P/Invoke (DllImport / LibraryImport / CsWin32)
- Apa itu TPM di Windows? — panduan bergambar tentang «brankas yang tidak pernah mengeluarkan kunci» dan measured boot
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#.
- Pengembangan aplikasi Windows
- Investigasi bug dan akar masalah
- Konsultasi teknis dan tinjauan desain
- Hubungi kami
Tautan referensi
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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 terkait
Artikel terbaru dengan tag yang sama untuk mendalami topik-topik terdekat.
Praktik terbaik multithreading di lapangan: edisi .NET — apa yang diputuskan sebelum menambah thread
Rangkuman praktis aturan desain yang mencegah kode multithread .NET/C# sesekali crash atau macet: bertumpu pada Task alih-alih membuat th...
Named pipes dalam praktik — IPC standar Windows dari desain hingga keamanan
Panduan praktis tentang named pipe, komunikasi antarpproses standar di Windows. Artikel ini menata, dari sumber primer, pilihan antara mo...
Aplikasi yang rusak saat bangun dari tidur — cara kerja event daya Windows dan cara membangun aplikasi bisnis yang bertahan
Anda membuka laptop dan koneksi aplikasi bisnis sudah mati — penyebabnya adalah desain yang tidak pernah memperhitungkan tidur. Artikel i...
Win32 Thread Pool API — konkurensi tanpa membuat thread, lewat CreateThreadpoolWork
Apakah Anda menebar panggilan CreateThread di seluruh kode native? Artikel ini menjelaskan Win32 thread pool API yang didesain ulang di V...
DllMain dan loader lock — alasan sebenarnya Anda diminta "jangan lakukan apa pun di inisialisasi DLL"
Mengapa Anda tidak boleh memanggil LoadLibrary atau menyinkronkan dengan thread lain dari DllMain. Berdasarkan sumber primer, artikel ini...
Topik terkait
Halaman-halaman ini menempatkan topik dalam konteks layanan dan keputusan yang lebih luas.
Topik teknis Windows
Portal tentang pengembangan Windows, investigasi bug, dan pemanfaatan aset yang ada.
Layanan yang terkait dengan topik ini
Artikel ini berkaitan langsung dengan layanan berikut.
Pengembangan aplikasi Windows
Aplikasi bisnis, integrasi perangkat, dan alat komunikasi, dari kebutuhan hingga pengembangan.
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.