C# और PowerShell से WMI/CIM का उपयोग — Hardware जानकारी, process monitoring और remote query की practical guide

· अद्यतन तिथि: · · Windows, C#, .NET, PowerShell, WMI, CIM, Business apps, Windows development

संशोधन इतिहास (पहला संस्करण, 1 Aug 2026 को प्रकाशित)
पहला प्रकाशन
इस लेख का हवाला दें(DOI: 10.5281/zenodo.22175754)

यह लेख Zenodo पर संग्रहीत है। नीचे वह DOI है जो हमेशा नवीनतम संस्करण की ओर ले जाता है, और वह DOI भी जो आपके पढ़े जा रहे संस्करण से बँधा है।

Go Komura (2026). C# और PowerShell से WMI/CIM का उपयोग — Hardware जानकारी, process monitoring और remote query की practical guide. KomuraSoft LLC. https://doi.org/10.5281/zenodo.22175754 https://comcomponent.com/hi/blog/wmi-cim-practical-guide/

DOI (नवीनतम संस्करण)
10.5281/zenodo.22175754
DOI (यह संस्करण)
10.5281/zenodo.22175755

«PC का serial number और model नाम business app की screen पर दिखाना है।» «Server के disk खाली स्थान की monitoring कर चेतावनी देनी है।» «किसी खास process के start होने का पता लगाना है।» «दूर बैठे PC की अवस्था एक जगह query करनी है।» — Windows के business apps और management tools के निर्माण में ये ज़रूरतें बार-बार आती हैं। और उनका आम उत्तर WMI (Windows Management Instrumentation) है, या standard नाम से CIM (Common Information Model)।

आम ज़रूरतें और WMI/CIMSerial number और model नाम दिखाना, disk खाली स्थान की monitoring, process start होने का पता, remote PC की query जैसी business app की आम ज़रूरतों का आम उत्तर WMI है, और standard नाम से CIMSerial number・model नामWMI(standard नाम CIM)Disk खाली स्थान की monitoringProcess start होने का पताRemote PC की query

चित्र 1: Business app की चार आम ज़रूरतों का आम उत्तर WMI/CIM है।

कठिनाई यह है कि WMI की जानकारी पुरानी और नई मिली-जुली है। खोजें तो Get-WmiObject वाले दस वर्ष पुराने लेख Get-CimInstance वाले लेखों के साथ बैठे मिलते हैं, और C# पक्ष पर System.Management तथा Microsoft.Management.Infrastructure दो वंश हैं। कौन वर्तमान लिखने का तरीका है और कौन «अभी चलता है पर नए code के लिए नहीं चुनना» — यह साफ नहीं। वास्तव में Get-WmiObject PowerShell 7 में है ही नहीं, और 5.1 के लिए लिखा internal script migrate करते यह अचानक सतह पर आता है।

यह लेख उन C#/PowerShell developers के लिए है जो business apps में hardware जानकारी प्राप्ति, process monitoring और remote PC query लागू करते हैं। WMI/CIM की संरचना की minimum समझ से PowerShell के CIM cmdlets, C# के दो API, अक्सर काम आने वाली recipes, performance・rights・64-bit के pitfalls, और अंत में «जहाँ WMI उपयोग नहीं करना चाहिए» का निर्णय — August 2026 तक के primary sources पर व्यवस्थित है।

1. पहले निष्कर्ष

  • CIM DMTF का management जानकारी का industry standard है, और WMI उसका Microsoft implementation। PowerShell और C# के CIM-परिवार API इस standard के वर्तमान पीढ़ी के API हैं, और जुड़ते वही underlying WMI से हैं।1
  • PowerShell में वर्तमान पीढ़ी CIM cmdlets हैं (Get-CimInstance / Invoke-CimMethod / Register-CimIndicationEvent)। पुराने WMI cmdlets (Get-WmiObject और चार अन्य) PowerShell 6 से हटा दिए गए हैं और PowerShell 7 में नहीं चलते।2
  • Default namespace root/CIMV2 है, और रोज़ की query मूलतः वहाँ की Win32_* classes को WQL से छानना है।3
  • Remote query का default WSMan (WinRM) है। -ComputerName देने से अस्थायी WSMan session बनता है। उसी target पर बार-बार query करें तो CIM session (New-CimSession) का reuse performance का established तरीका है, और पुराने target जहाँ WinRM configure न हो वहाँ DCOM protocol option है।34
  • C# में दो वंश हैं: System.Management (ManagementObjectSearcher) और Microsoft.Management.Infrastructure (CimSession)। दोनों केवल Windows हैं, और वर्तमान .NET पर NuGet से आते हैं। Remote query या monitoring को product में जोड़ रहे हों तो CIM cmdlets जैसा type तंत्र रखने वाला MI API बेहतर बैठता है।56
  • Process start होने का पता event subscription से लगाएँ, polling से नहीं। Win32_ProcessStartTrace की subscription admin rights से चलानी होती है।78
  • SELECT * आदत से न लिखें। -Filter / -Property / -KeyOnly से स्थानांतरित data छानना WMI के performance मुद्दों का लगभग आधा रोकता है।3
  • WMI सार्वभौमिक हल नहीं। High-frequency performance monitoring, अपने app की settings पढ़ना-लिखना, या एकमुश्त OS function call के लिए performance counters, registry, Win32 API, या dedicated cmdlets बेहतर बैठते हैं (अध्याय 8 की decision table)।

Diagram में solid line हमेशा लागू रहने वाला relation दिखाती है और dashed line conditional relation दिखाती है (शर्तें detail page पर हर relation के explanation में दी गई हैं)। Relations की पूरी list (कुल 26, evidence और certainty सहित) तथा मुख्य concepts की definitions knowledge map की detail page पर संकलित हैं (जापानी में)। Data: JSON-LD / Turtle

2. WMI/CIM क्या है — Standard बनाम implementation, namespace, class और WQL

पहले शब्दावली एक बार साफ कर लें।

शब्द वह क्या है
CIM (Common Information Model) Systems, apps, network और devices जैसे management targets को व्यक्त करने वाला industry-standard model। DMTF (Distributed Management Task Force) तय और रखता है1
WBEM (Web-Based Enterprise Management) Enterprise environment में management जानकारी तक पहुँच की standard तकनीक बनाने की industry पहल1
WMI WBEM का Microsoft implementation। CIM standard से management targets व्यक्त करता है और Windows में बना होता है1
MI (Windows Management Infrastructure) WMI की अगली पीढ़ी। पुराने WMI से पूर्ण compatible, और नए providers अधिकतर MI में लिखे जाते हैं1
CIM standard और WMI implementation का संबंधDMTF तय और रखे CIM standard को WBEM पहल के ढाँचे में उपयोग करते हैं, उसका Microsoft implementation WMI है, अगली पीढ़ी MI पुराने WMI से पूर्ण compatible है, और CIM-परिवार API उसी WMI आधार से जुड़ते हैंDMTF तय और रखता हैCIM(industry standard model)WBEM(industry पहल)WMI(Microsoft implementation)MI(अगली पीढ़ी・पूर्ण compatible)CIM-परिवार API(PowerShell / C#)

चित्र 2: CIM specification है, WMI Windows पर implementation। CIM-परिवार API उसी WMI आधार से जुड़ते हैं।

Developer के रूप में चार संरचनात्मक टुकड़े समझने लायक हैं।

  • Namespace: Classes बाँधने वाला hierarchy। रोज़ की query में लगभग हमेशा root/CIMV2 उपयोग होता है, और CIM cmdlets का default भी यही है।3 अन्य में root\default (registry provider आदि) है।
  • Class: Management target का प्रकार, जैसे Win32_ComputerSystem (computer स्वयं), Win32_LogicalDisk (logical drive), या Win32_Process (process)। CIM-standard classes (CIM_LogicalDisk आदि) से inheritance लेने वाली Windows-specific classes Win32_ prefix रखती हैं।9
  • Provider: वह component जो class का पदार्थ देता है। Query करने पर provider वहीं OS से पूछकर मान बनाता है।
  • WQL: SQL-जैसी query language। SELECT Name, State FROM Win32_Service WHERE StartMode = 'Auto' की तरह class को तालिका मानकर छानती है। CIM cmdlets की default query language भी WQL है।3

«OS और hardware की जानकारी एक समान class और query language से पढ़ना» — यही WMI का मूल्य है। उलटा, लिखना और operations उन कुछ classes तक सीमित है जिनके methods Invoke-CimMethod से बुलाए जा सकें; यह ऐसा mechanism नहीं जो सब कुछ कर सके।

WMI query की संरचनाWQL query namespace root/CIMV2 की Win32_* classes की ओर जाती है, class का पदार्थ देने वाला provider वहीं OS से पूछकर मान बनाता है, और परिणाम लौटता हैWQL से queryNamespace root/CIMV2Win32_* classProviderवहीं OS से पूछता हैपरिणाम लौटाता है

चित्र 3: Query namespace, class, provider के क्रम से चलती है, और मान वहीं बनते हैं।

3. PowerShell से उपयोग — CIM cmdlets वर्तमान हैं, WMI cmdlets हटाए गए हैं

3.1. मूल बात: Get-CimInstance

# Class नाम से (default namespace root/CIMV2)
Get-CimInstance -ClassName Win32_OperatingSystem

# WHERE खंड की सामग्री ही -Filter में लिखें (WHERE शब्द स्वयं न लिखें)
Get-CimInstance -ClassName Win32_Service -Filter "StartMode = 'Auto' AND State <> 'Running'"

# केवल आवश्यक properties लेकर स्थानांतरित मात्रा घटाएँ
Get-CimInstance -ClassName Win32_Process -Property Name, ProcessId, CreationDate

# कच्चा WQL लिखना हो तो -Query
Get-CimInstance -Query "SELECT * FROM Win32_Process WHERE Name LIKE 'p%'"

-Filter ठीक WQL का WHERE खंड है, और -Property प्राप्त columns सीमित करता है।3 लौटा मान CimInstance object है, और date properties (CreationDate या LastBootUpTime आदि) पहले से DateTime में convert लौटते हैं। पुराने Get-WmiObject से भिन्न, प्राप्त object पर methods सीधे नहीं होते, इसलिए method call Invoke-CimMethod को pipe करके करते हैं।

CimInstance पर method callGet-CimInstance का CimInstance date properties DateTime में convert लौटाता है पर methods सीधे नहीं रखता, इसलिए method call instance को Invoke-CimMethod को देकर करते हैंGet-CimInstanceCimInstance objectDates DateTime में convertMethods सीधे नहीं होतेInvoke-CimMethod को देंMethod call

चित्र 4: CimInstance पर methods सीधे नहीं होते, इसलिए method call Invoke-CimMethod को देकर करते हैं।

# Instance के methods बुलाना: प्रत्येक process का owner प्राप्त करें
Get-CimInstance -ClassName Win32_Process -Filter "Name = 'notepad.exe'" |
    Invoke-CimMethod -MethodName GetOwner

# Class का static method बुलाना: process शुरू करें
Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments @{ CommandLine = 'notepad.exe' }

# Class definition जाँचें (properties और methods)
Get-CimClass -ClassName Win32_Process

3.2. पुराने WMI cmdlets से migration तालिका

PowerShell 6 से आगे (वर्तमान PowerShell 7 सहित) निम्न WMI v1 cmdlets हटा दिए गए हैं। वही कार्य CimCmdlets module (WMI v2) देता है।2

पुराना (Windows PowerShell 5.1 तक) वर्तमान (CIM cmdlets) नोट
Get-WmiObject Get-CimInstance -Filter / -Query की अवधारणा वही है
Get-WmiObject -List Get-CimClass Class definition खोजना और जाँचना
Invoke-WmiMethod Invoke-CimMethod Arguments -Arguments @{ } hashtable से दिए जाते हैं
Register-WmiEvent Register-CimIndicationEvent Event subscription (अध्याय 6.3)
Set-WmiInstance Set-CimInstance लिखने योग्य properties बदलना
Remove-WmiObject Remove-CimInstance Instance हटाना

Windows PowerShell 5.1 पर भी CIM cmdlets चलते हैं, इसलिए अब जो लिखें, 5.1 पर चलाना हो तब भी CIM पक्ष पर लिखें — इससे migration cost पीछे नहीं रहती। 5.1 और 7 के सह-अस्तित्व व migration का पूरा चित्र «Windows PowerShell 5.1 और PowerShell 7 के अंतर» में है।

नया script CIM में लिखने का कारणWMI cmdlets से लिखा script 5.1 पर चलता है पर PowerShell 6 से हटाया जा चुका है इसलिए migration पर दोबारा लिखना पड़ता है, CIM cmdlets 5.1 पर भी चलते हैं इसलिए नया CIM पक्ष पर लिखें तो migration cost नहीं रहतीWMI cmdletsCIM cmdletsनया script लिख रहे हैंकिसमें लिखें?5.1 पर चलता है5.1 पर भी चलता हैPowerShell 7 में हटाए गएMigration पर दोबारा लिखनाMigration cost नहीं रहती

चित्र 5: नया CIM cmdlets से लिखें तो PowerShell 7 migration पर दोबारा लिखना नहीं पड़ता।

4. Remote query — CIM session (default WSMan) और DCOM option

CIM cmdlets, target न दें तो local WMI से COM पर जुड़ते हैं; -ComputerName दें तो WSMan (WinRM) protocol पर अस्थायी session बनाकर जुड़ते हैं। उसी computer पर कई operations करने हों तो CIM session बनाकर उसका reuse performance के लिए बेहतर है।3

CIM connection तरीके का चुनावSpecified न हो तो local WMI से COM connection, ComputerName देने पर हर query पर WSMan अस्थायी session बनता है, उसी target पर कई operations के लिए New-CimSession का reuse performance में लाभदायक है, और WinRM बिना target के लिए DCOM protocol option हैनहींहाँएक बारकईCIM cmdlets चलाएँComputerName दिया?Local WMI से COM connectionउसी target पर कई operations?WSMan अस्थायी sessionNew-CimSession reuseहर query पर बनता हैWinRM बिना targetDCOM protocol option

चित्र 6: Remote query का default WSMan है, और उसी target पर कई operations के लिए CIM session का reuse established तरीका है।

# एक बार की query के लिए -ComputerName (हर बार अस्थायी session बनता है)
Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName Server01, Server02

# बार-बार query हो तो CIM session reuse करें
$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

जिन targets तक WSMan से न पहुँच सकें — जैसे पुरानी machine जहाँ WinRM configure न हो — वहाँ DCOM protocol चुन सकते हैं।4

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

Remote query की पूर्वापेक्षाएँ निम्न हैं।

  • Target पर WinRM configure होना चाहिए। winrm quickconfig service को automatic start करता है, HTTP listener (default port 5985) बनाता है, और firewall exception register करता है — सब एक साथ।10 HTTPS (default port 5986) से जुड़ना हो तो अकेले यह काफी नहीं — server certificate तैयार कर winrm quickconfig -transport:https जैसे से HTTPS listener अलग configure करना पड़ता है।10
  • मार्ग के firewall पर संबंधित ports खुले हों। Inbound rules design और register करने का practical काम «Windows firewall और business apps» लेख में है।
  • Authentication। Domain environment में Kerberos mutual authentication देता है। Workgroup में Kerberos नहीं होता, इसलिए client की TrustedHosts सूची में target register करना पड़ सकता है। वह सूची यथासंभव संकीर्ण रखें।10
  • Rights। Default configuration में remote WMI query और operations मूलतः target के Administrators group वाले account से होते हैं। सामान्य users के लिए खोलना हो तो WinRM और WMI namespace दोनों पर पहुँच permission configure करनी पड़ती है।10
  • ध्यान दें कि DCOM का कोई स्थिर प्रतीक्षा port नहीं (RPC के dynamic ports उपयोग होते हैं), इसलिए firewall पार design कठिन हो जाता है। अब जो mechanism बनाएँ उसके लिए WSMan को default मानना सुरक्षित है।
Remote query की पूर्वापेक्षा जाँचनाTarget पर winrm quickconfig service automatic start, HTTP listener बनाना और firewall exception registration एक साथ करता है, HTTPS listener certificate तैयार कर अलग configure होता है, और workgroup में TrustedHosts registration आवश्यक हो सकता हैwinrm quickconfigService automatic startHTTP listener बनाना(5985)Firewall exceptionHTTPS listener(5986)Certificate तैयार कर अलग configureWorkgroup environmentTrustedHosts में registration

चित्र 7: winrm quickconfig default configuration एक साथ करता है, HTTPS listener और workgroup authentication अलग सँभालने पड़ते हैं।

5. C# से उपयोग — System.Management और Microsoft.Management.Infrastructure

C# से WMI के API दो वंश हैं। दोनों केवल Windows हैं।

  System.Management Microsoft.Management.Infrastructure (MI API)
लाना .NET Framework में default। वर्तमान .NET पर NuGet package System.Management5 NuGet package Microsoft.Management.Infrastructure6
प्रवेश class ManagementObjectSearcher (WQL देकर query)5 CimSession (Create → QueryInstances / InvokeMethod / Subscribe)6
Type तंत्र ManagementObject / ManagementEventWatcher11 CimInstance / CimSession — CIM cmdlets जैसे ही types3
Remote पहुँच DCOM-based WSMan (CIM session) based। Async form (*Async) उपलब्ध6
सबसे उपयुक्त Local जानकारी प्राप्ति। मौजूदा code संपत्ति बनाए रखना Remote query और monitoring जोड़ना। PowerShell के साथ design

5.1. System.Management: ManagementObjectSearcher की मूल बातें

WQL string के रूप में देते हैं और Get() से परिणाम संग्रह पाते हैं।5

// NuGet: System.Management (केवल 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"]} खाली {freeGb:F1} GB / कुल {sizeGb:F1} GB");
}

Properties indexer से object के रूप में लौटते हैं, इसलिए class documentation में CIM type जाँचें (इस उदाहरण में FreeSpace / Size uint64 हैं9) और तदनुसार cast करें। इसे int मानकर cast करना, जिससे InvalidCastException आए, यहाँ का classic पहला ठोकर है।

Property प्राप्ति और cast का pitfallSystem.Management के properties indexer से object के रूप में लौटते हैं इसलिए class documentation में CIM type जाँचकर cast करना पड़ता है, int मानकर cast करें तो InvalidCastException आता हैIndexer से प्राप्तobject के रूप में लौटता हैDocumentation में CIM type जाँचेंसही type में castint मानकर castInvalidCastException

चित्र 8: Properties object के रूप में लौटते हैं, इसलिए cast से पहले CIM type जाँचें।

5.2. MI API: CimSession की मूल बातें

CimSession local और remote पहुँच एक ही आकार में सँभालता है। Enumeration, query, method call, event subscription और async form सब एक जगह हैं।6

// NuGet: Microsoft.Management.Infrastructure (केवल Windows)
using Microsoft.Management.Infrastructure;

// Local के लिए CimSession.Create(null), remote के लिए computer नाम दें
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} खाली {free / 1024.0 / 1024 / 1024:F1} GB");
}

क्योंकि यह वही CimInstance सँभालता है जो PowerShell के CIM cmdlets लौटाते हैं, «पहले PowerShell में आज़माएँ, फिर C# में उतारें» वाला development flow सहज जुड़ता है। C# और PowerShell के एकीकरण को स्वयं design कर रहे हों तो «C# (CSharp) से PowerShell चलाकर परिणाम object के रूप में पाना» भी देखें।

PowerShell में आज़माकर C# में उतारने का flowPowerShell के CIM cmdlets और C# का MI API वही CimInstance type सँभालते हैं, इसलिए PowerShell में prototype कर C# में उतारने का development flow सहज जुड़ता हैPowerShell में prototypeCIM cmdletsC# में वास्तविक implementationMI APIवही CimInstance typeउतारना सहज जुड़ता है

चित्र 9: CIM cmdlets और MI API वही CimInstance type सँभालते हैं, इसलिए prototype से वास्तविक implementation तक जुड़ता है।

6. अक्सर काम आने वाली recipes

6.1. आम classes की त्वरित तालिका

चाहिए जानकारी Class मुख्य properties
निर्माता / model नाम Win32_ComputerSystem Manufacturer, Model
Chassis serial number Win32_BIOS SerialNumber
OS version / boot समय Win32_OperatingSystem Caption, Version, LastBootUpTime
Disk खाली स्थान Win32_LogicalDisk DeviceID, FreeSpace, Size, DriveType9
Service अवस्था Win32_Service Name, State, StartMode
Process सूची Win32_Process Name, ProcessId, CommandLine

6.2. संपत्ति management का आम काम: Serial number, model नाम और disk खाली स्थान

# Model जानकारी और serial number (PC asset register से मिलान के लिए)
$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
}

# Local disk (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 «local disk» का मान है, और removable (2), network drive (4), तथा CD (5) हटाता है।9 Monitoring के लिए यही script CIM session से प्रत्येक server पर घुमाना agent-less disk monitoring की नींव देता है।

Agent-less disk monitoring की नींवDriveType 3 से छानकर removable, network drive और CD हटा local disk ही target बनाते हैं, और वही script CIM session से प्रत्येक server पर घुमाने से agent-less disk monitoring की नींव बनती हैखाली स्थान प्राप्ति scriptDriveType = 3 से छानेंRemovable आदि हटाएँCIM session के ज़रिएप्रत्येक server पर घुमाएँAgent-less monitoring

चित्र 10: Local disk तक छानी script CIM session से प्रत्येक server पर घुमाना monitoring की नींव है।

6.3. Process start होने का पता — Event subscription

«Polling से Win32_Process समय-समय पर लाकर अंतर देखना» के बजाय event subscription लें। Process start पकड़ने का सरल तरीका Win32_ProcessStartTrace की subscription है (kernel trace provider की event class, properties ProcessName / ProcessID / ParentProcessID आदि8)।

# Admin (elevated) PowerShell session से चलाएँ
$action = {
    $name = $Event.SourceEventArgs.NewEvent.ProcessName
    $id   = $Event.SourceEventArgs.NewEvent.ProcessID
    Write-Host "Process start: $name (PID=$id)"
}
Register-CimIndicationEvent -ClassName Win32_ProcessStartTrace `
    -SourceIdentifier ProcessStarted -Action $action

Subscription उस PowerShell session के जीवित रहने तक चालू रहती है जिसने उसे register किया, और हर process start पर -Action चलता है। Subscription-हटाने का आदेश इसके तुरंत बाद उसी batch में न चलाएँ — ऐसा करने से monitoring शुरू होने से पहले subscription गायब हो जाती है। हटाना monitoring समाप्त करते समय चलाएँ।

# Monitoring समाप्त करते समय: subscription हटाएँ
Unregister-Event -SourceIdentifier ProcessStarted

Register-CimIndicationEvent class नाम या WQL event query से subscription register करता है, और -Action script block हर आगमन पर चलता है।7 इस class की subscription के लिए admin rights आवश्यक हैं।7 Event कौन प्राप्त कर सकता है यह event class के security descriptor से नियंत्रित है, और बिना elevated rights के सामान्य user को पहुँच denied होती है।8

Process-start event subscription का flowAdmin rights वाले PowerShell session में Register-CimIndicationEvent subscription register करता है, हर process start पर event आता है और Action चलता है, monitoring समाप्त करते Unregister-Event से हटाते हैंWMIPowerShell sessionWMIPowerShell sessionAdmin rights से चलाएँRegister-CimIndicationEvent से subscription registrationहर process start पर event आता है-Action चलाएँUnregister-Event से हटाएँ(monitoring समाप्त पर)

चित्र 11: Subscription register सत्र के जीवित रहने तक चालू रहती है, और हटाना monitoring समाप्त करते समय करते हैं।

दूसरा तरीका किसी भी class पर चलने वाला सामान्य instance-creation event (__InstanceCreationEvent) है। यहाँ WMI WITHIN से दिया interval पर polling कर अंतर को event बनाता है, इसलिए पता लगाने के interval और भार का समझौता स्वयं तय करना पड़ता है।

Process start पकड़ने के दो subscription तरीकेWin32_ProcessStartTrace kernel trace provider की event class की subscription है, सामान्य __InstanceCreationEvent में WMI WITHIN दिए interval पर polling कर अंतर को event बनाता है इसलिए पता interval और भार का समझौता स्वयं तय करते हैंProcess start होने का पताWin32_ProcessStartTrace__InstanceCreationEventKernel trace की subscriptionWITHIN interval पर pollingInterval और भार का समझौता

चित्र 12: Dedicated event class की subscription लें, या polling interval सहित सामान्य instance-creation event उपयोग करें।

# 5 सेकंड interval की polling से Win32_Process के नए instances की monitoring
$query = "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process'"
Register-CimIndicationEvent -Query $query -SourceIdentifier ProcPoll -Action {
    Write-Host "Start: $($Event.SourceEventArgs.NewEvent.TargetInstance.Name)"
}

C# (System.Management) में ManagementEventWatcher वही भूमिका निभाता है।11

using System.Management;

// Administrator के रूप में चल रहे process में
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($"Process start: {name} (PID={pid})");
};
watcher.Start();
// Monitoring समाप्त पर watcher.Stop() और Dispose न भूलें

स्थायी monitoring में जोड़ते समय, subscription टूटने पर फिर registration (service फिर start पर・error पर) तक design में शामिल करें। Device monitoring सहित «अवस्था जाँचना और दिखाना» का design «बाहरी उपकरणों की अवस्था जाँचने और दिखाने की सर्वोत्तम प्रथाएँ» में है।

स्थायी monitoring की subscription lifecycleस्थायी monitoring में subscription चालू अवस्था service फिर start या error से टूट सकती है, इसलिए टूटना पकड़कर फिर registration कर subscription चालू पर लौटाने तक design में शामिल करेंService फिर start・errorSubscription चालूSubscription टूटी अवस्थाफिर registration

चित्र 13: स्थायी monitoring में, subscription टूटने पर फिर registration कर subscription चालू पर लौटाने तक design शामिल करें।

7. Pitfalls — Performance, rights, 64-bit, repository और dates

7.1. SELECT * और polling की अधिकता

WMI query «provider वहीं मान बनाता है» वाला काम है — मुफ़्त नहीं। दो classic anti-patterns हैं।

  • SELECT * की आदत। Win32_Process के हर property की हर पंक्ति लें तो provider का काम और network transfer (remote पर) उसी अनुपात में बढ़ता है। पंक्तियाँ -Filter से, columns -Property से छानें, और आगे के operations के लिए केवल key चाहिए तो -KeyOnly उपयोग करें। ये सभी «object आकार और network traffic घटाने» के आधिकारिक साधन हैं।3
  • कम interval polling। «हर सेकंड Get-CimInstance Win32_Process» जैसा design अध्याय 6.3 की event subscription से बदलें। Polling रूप (WITHIN) लेना ही पड़े तो interval आवश्यकता के लिए यथेष्ट तक बढ़ाएँ।

साथ ही, remote पर एक-एक target -ComputerName से दोहराना भी बहुत व्यर्थ है। हर query पर अस्थायी session बनता है, इसलिए कई operations CIM session के reuse पर ले जाएँ।3

Performance anti-patterns और उनके स्थानSELECT तारांकन की आदत Filter और Property से पंक्ति और column छानकर केवल key हो तो KeyOnly से बदलें, कम interval polling event subscription से, एक-एक ComputerName दोहराना CIM session reuse से बदलेंSELECT * की आदतFilter और Property से छानेंकेवल key हो तो KeyOnlyकम interval pollingEvent subscription से बदलेंएक-एक ComputerNameCIM session reuse

चित्र 14: पंक्ति・column・key छानना और event subscription पर जाना WMI के performance मुद्दों का लगभग आधा रोकता है।

7.2. Event subscription के rights

अध्याय 6.3 के अनुसार, Win32_ProcessStartTrace परिवार की subscription admin rights मानती है।7 «Development machine (admin से चला) पर चला, पर ग्राहक के सामान्य-user environment में monitoring नहीं चलती» firewall सूचना dialog के साथ classic दुर्घटना है। सामान्य user से चलने वाले business app में monitoring जोड़ें तो monitoring भाग Windows service (LocalSystem आदि) में अलग करें, और app मुख्य भाग से inter-process communication से जोड़ने का ढाँचा सोचें।

सामान्य-user environment में monitoring ढाँचाAdmin rights वाली subscription सामान्य user से चलने वाले app मुख्य भाग से काटें, monitoring LocalSystem आदि से चलने वाली Windows service में अलग करें, और app मुख्य भाग से inter-process communication से जोड़ेंInter-process communicationMonitoring Windows serviceStart trace की subscriptionLocalSystem आदि से चलाएँApp मुख्य भाग(सामान्य user)

चित्र 15: Admin rights वाली subscription service पक्ष पर अलग करें, और app मुख्य भाग से inter-process communication से जोड़ें।

7.3. 32-bit/64-bit और provider

64-bit Windows पर कुछ providers 32-bit और 64-bit दोनों रूप में साथ रहते हैं, और default से caller app की bit संख्या से मेल खाने वाला पक्ष उत्तर देता है।12 Classic उदाहरण root\default का registry provider (StdRegProv) है: 32-bit app से पढ़ने पर Wow6432Node पक्ष (32-bit view) के मान लौटते हैं।12 «WMI से पढ़ा registry मान regedit में दिखे मान से भिन्न है» हो तो पहले यही संदेह करें। दूसरा view चाहिए तो connection context में __ProviderArchitecture (और बाध्य करना हो तो __RequiredArchitecture) देकर स्पष्ट माँग सकते हैं।12 Bit-संख्या समस्या का पूरा चित्र «C# से Win32 API सुरक्षित बुलाना — P/Invoke practical guide» में भी है।

64-bit environment में provider चुनावDefault से caller app की bit संख्या से मेल खाने वाला provider उत्तर देता है, 32-bit app की registry query Wow6432Node पक्ष का मान पाती है, पर __ProviderArchitecture से उलटा view स्पष्ट माँग सकते हैं32-bit64-bitCaller की bit संख्या?32-bit provider उत्तर देता है64-bit provider उत्तर देता हैRegistry Wow6432Node पक्ष का मान__ProviderArchitecture specifiedउलटा view स्पष्ट माँगें

चित्र 16: Default से caller की bit संख्या से मेल खाने वाला पक्ष उत्तर देता है, इसलिए 32-bit app Wow6432Node पक्ष पढ़ता है।

7.4. WMI repository क्षति के लक्षण और उपाय

WMI की class definitions repository में stored हैं (एक file नहीं — Repository folder की files मिलकर database का काम करती हैं13)। Inconsistency हो तो «जो class होनी चाहिए वह नहीं मिलती» या «namespace invalid है» जैसी errors app पक्ष कुछ बदले बिना शुरू हो जाती हैं। Diagnostics और मरम्मत के लिए winmgmt.exe उपयोग करें।13

rem Consistency जाँच (परिणाम inconsistent हो तो inconsistency है)
winmgmt /verifyrepository

rem Consistency जाँच + inconsistency हो तो rebuild (पढ़ने योग्य सामग्री merge होती है)
winmgmt /salvagerepository

ध्यान यह है कि repository delete करना या initialize करना पहला कदम न बनाएँ। WMI से आने वाली error OS के अन्य भाग से भी हो सकती है, और Microsoft स्पष्ट कहता है कि repository delete करना पहला उपाय बनाने से «system या स्थापित apps को क्षति पहुँच सकती है»।13 क्रम रखें: /verifyrepository से जाँच → /salvagerepository से मरम्मत।

WMI repository inconsistency छाँटने की प्रक्रियाClass नहीं मिलती जैसी error आए तो winmgmt के verifyrepository से consistency जाँचें, inconsistency हो तो salvagerepository से rebuild करें, और repository delete करना या initialize करना पहला कदम न बनाएँहाँनहींClass नहीं मिलती आदि errorwinmgmt /verifyrepositoryपरिणाम inconsistent?winmgmt /salvagerepositoryOS के अन्य भाग का कारण सोचेंपढ़ने योग्य सामग्री merge होती हैRepository delete・initialize करनापहला कदम न बनाएँ

चित्र 17: verify से जाँचकर salvage से मरम्मत का क्रम रखें, delete करना पहला कदम न बनाएँ।

7.5. DMTF date रूप का conversion

WMI dates CIM specification के DMTF रूप yyyymmddHHMMSS.mmmmmm±UUU (अंत UTC से मिनटों में offset। उदाहरण: 20260801100000.000000+540) की string में stored हैं। कच्चे मान को string processing से काट-छाँटना बंद करें; conversion API उपयोग करें।

  • C# (System.Management): ManagementDateTimeConverter DMTF रूप और DateTime / TimeSpan का पारस्परिक conversion देता है।11
  • CIM-परिवार API (Get-CimInstance / MI API): Date properties पहले से DateTime में convert लौटते हैं, इसलिए यह समस्या उठती ही नहीं। (Get-CimInstance Win32_OperatingSystem).LastBootUpTime सीधे DateTime के रूप में गणना में उपयोग हो सकता है।
DMTF date रूप का व्यवहारWMI dates DMTF रूप की string में stored हैं, System.Management से कच्चा मान पढ़ें तो ManagementDateTimeConverter से convert करें, CIM-परिवार API DateTime में पहले से convert लौटाता है, इसलिए खुद string काट-छाँट न करेंSystem.ManagementCIM-परिवार APIDMTF रूप की stringकिस API से प्राप्त?ManagementDateTimeConverterDateTime में पहले से convertDateTime / TimeSpan में conversionखुद string काट-छाँटउपयोग न करें

चित्र 18: DMTF string का conversion conversion API पर छोड़ें, CIM-परिवार API हो तो convert DateTime ज्यों का त्यों उपयोग करें।

8. जहाँ WMI उपयोग नहीं करना चाहिए — साधन की decision table

WMI «एक समान पढ़ने का मुख» के रूप में उत्तम है, पर हमेशा सर्वोत्तम हल नहीं। Practical चुनाव का अनुमान यह है।

करना क्या है उपयुक्त साधन WMI न चुनने का कारण
Hardware जानकारी・OS configuration प्राप्ति, agent-less remote query WMI/CIM यही WMI का घर है — dedicated API एक-एक कर बुलाने से अधिक एकरूप
अपने app की settings पढ़ना-लिखना Registry सीधा पढ़ना (Microsoft.Win32.Registry)・configuration file WMI से registry operations घुमावदार है, और अध्याय 7.3 की bit-संख्या समस्या भी साथ आती है
CPU उपयोग जैसी high-frequency, निरंतर performance monitoring Performance counters (System.Diagnostics.PerformanceCounter आदि) Counters ठीक इसी के लिए हैं। WMI की कम interval polling भार और सटीकता दोनों में पिछड़ती है
एकमुश्त OS function call・कम latency चाहिए वाला processing Win32 API (P/Invoke) WMI COM/provider से गुज़रने का overhead रखता है
अपने process rights पर्याप्त हों तो local process enumeration・operations System.Diagnostics.Process Standard library में पूरा होता है, dependency घटती है
Firewall・network जैसी Windows management features configure करना Get-NetFirewallRule जैसे dedicated CIM-based cmdlets कच्चे WMI classes खोजने से, उपयोग के अनुसार बने cmdlet समूह अधिक सटीक और सुरक्षित हैं
File・folder परिवर्तन का पता FileSystemWatcher जहाँ dedicated API है वहाँ WMI न लाएँ

निर्णय की धुरी सरल है: «जहाँ dedicated mechanism है वहाँ dedicated mechanism उपयोग करें, cross-cutting query और remote query के लिए WMI/CIM रखें»। अंतिम पंक्ति का Get-NetFirewallRule आदि internal रूप से CIM पर बने cmdlet समूह हैं — «WMI/CIM को सीधे छुए बिना केवल उसका लाभ लेना» वाला रूप।

साधन निर्णय की धुरीजहाँ dedicated mechanism है वहाँ dedicated mechanism उपयोग करें, जहाँ नहीं वहाँ cross-cutting query और remote query के लिए WMI और CIM उपयोग करना निर्णय की धुरी है, और dedicated CIM-based cmdlets WMI और CIM को सीधे छुए बिना केवल लाभ लेने का रूप हैंहैनहींDedicated mechanism है?Dedicated mechanism उपयोग करेंWMI / CIM उपयोग करेंCross-cutting query・remote queryDedicated CIM-based cmdletsकेवल लाभ लेने का रूप

चित्र 19: जहाँ dedicated mechanism है वहाँ dedicated उपयोग करें, cross-cutting query और remote query के लिए WMI/CIM रखें।

9. सारांश

  • CIM DMTF का industry standard है, WMI उसका Microsoft implementation। PowerShell के CIM cmdlets और C# का MI API दोनों इस standard के वर्तमान पीढ़ी के प्रवेश हैं।
  • PowerShell में Get-CimInstance / Invoke-CimMethod / Register-CimIndicationEvent वर्तमान हैं। Get-WmiObject जैसे WMI cmdlets PowerShell 7 में नहीं हैं, इसलिए नया script 5.1 के लिए हो तब भी CIM पक्ष पर लिखें।
  • Remote query का default WSMan (WinRM) है, और कई operations CIM session का reuse करें। WinRM बिना target के लिए DCOM option बच निकलने का मार्ग है।
  • C# में System.Management (सहज, local-उन्मुख) और Microsoft.Management.Infrastructure (remote・monitoring-उन्मुख, CIM cmdlets जैसा type तंत्र) में से चुनें। दोनों केवल-Windows NuGet packages हैं।
  • Process monitoring polling नहीं, event subscription से। Win32_ProcessStartTrace की subscription के लिए admin rights आवश्यक हैं।
  • SELECT * और कम interval polling से बचें, -Filter / -Property / -KeyOnly से छानें। 32-bit process की query 32-bit provider की ओर जाती है, DMTF date conversion API से बदलें, repository क्षति हटाने से नहीं verify → salvage के क्रम से सँभालें — यह याद रखें।
  • जहाँ dedicated mechanism है (settings, performance counters, एकमुश्त API call) वहाँ WMI न लाएँ, cross-cutting query और remote query के लिए WMI/CIM उपयोग करें — यही उपयोग की एक पंक्ति है।

संबंधित लेख

संबंधित परामर्श क्षेत्र

KomuraSoft LLC WMI/CIM से hardware जानकारी प्राप्ति, process monitoring और remote PC query को business apps में जोड़ने, Get-WmiObject पर आधारित internal scripts को CIM cmdlets पर migrate करने, और «development machine पर चलता है पर ग्राहक स्थल पर rights error आती है» जैसी समस्याओं की जाँच सँभालता है। PowerShell में prototype से C# में वास्तविक implementation तक एक ही धारा में परामर्श ले सकते हैं।

संदर्भ लिंक

  1. Microsoft Learn, About WMI. इस पर कि WMI WBEM (enterprise environment में management जानकारी तक पहुँच की standard तकनीक विकसित करने की industry पहल) का Microsoft implementation है; management targets को CIM (Common Information Model) industry standard से व्यक्त करता है, जिसे DMTF (Distributed Management Task Force) विकसित और रखता है; अगली पीढ़ी MI (Windows Management Infrastructure) पुराने WMI से पूर्ण compatible है; और remote WMI connections DCOM से होते हैं, option के रूप में WS-Management-based WinRM है। ↩ ↩2 ↩3 ↩4 ↩5

  2. Microsoft Learn, Differences between Windows PowerShell 5.1 and PowerShell 7.x. इस पर कि WMI v1 cmdlets (Register-WmiEvent / Set-WmiInstance / Invoke-WmiMethod / Get-WmiObject / Remove-WmiObject) PowerShell से हटा दिए गए हैं, और CimCmdlets module (WMI v2) के cmdlets वही कार्य नई features और redesign किए syntax के साथ देते हैं। ↩ ↩2

  3. Microsoft Learn, Get-CimInstance (CimCmdlets). इस पर कि न ComputerName न CimSession दें तो local WMI से COM session पर जुड़ता है, और -ComputerName देने पर WsMan protocol का अस्थायी session बनता है; उसी computer पर कई operations के लिए CIM session से जुड़ना performance के लिए recommended है; -Filter WHERE शब्द रहित WQL/CQL where खंड है; -Property और -KeyOnly object आकार और network traffic घटाते हैं; default namespace root/CIMV2 और default query language (-QueryDialect) WQL है; output Microsoft.Management.Infrastructure.CimInstance है; Invoke-CimMethod के साथ GetOwner बुलाने का उदाहरण; और cmdlet केवल Windows है। ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10

  4. Microsoft Learn, New-CimSessionOption (CimCmdlets). इस पर कि CIM session option के दो parameter sets हैं, WsMan और DCOM के लिए; -Protocol Dcom / Default / Wsman ले सकता है; New-CimSessionOption -Protocol Dcom से बना option New-CimSession के -SessionOption में देकर DCOM CIM session बनाने का उदाहरण; और DCOM session का default impersonation level Impersonate है। ↩ ↩2

  5. Microsoft Learn, ManagementObjectSearcher Class (System.Management). इस पर कि यह specified WQL query के आधार पर management objects का संग्रह प्राप्त करने वाला, management जानकारी प्राप्ति का सबसे आम प्रवेश class है; ObjectQuery और ManagementScope (WMI namespace) लेकर Get() से ManagementObjectCollection लौटाता है; और System.Management.dll NuGet package System.Management के रूप में दिया जाता है। ↩ ↩2 ↩3 ↩4

  6. Microsoft Learn, CimSession Class (Microsoft.Management.Infrastructure). इस पर कि Microsoft.Management.Infrastructure.dll NuGet package Microsoft.Management.Infrastructure के रूप में दिया जाता है; Create(computerName) से session बनाना; QueryInstances(namespace, queryDialect, query) से query चलाना; और EnumerateInstances / GetInstance / InvokeMethod / Subscribe तथा प्रत्येक के async (*Async) form, IDisposable लागू करते हुए। ↩ ↩2 ↩3 ↩4 ↩5

  7. Microsoft Learn, Register-CimIndicationEvent (CimCmdlets). इस पर कि class नाम या query व्यंजक से indication (event) की subscription लेते हैं और -SourceIdentifier से subscription नाम देते हैं; Win32_ProcessStartTrace subscription का उदाहरण और PowerShell Administrator के रूप में चलाने की आवश्यकता का नोट; -Action script block में $Event.SourceEventArgs.NewEvent से ProcessName / ProcessId संदर्भ का उदाहरण; -ComputerName देने पर WsMan अस्थायी session, न देने पर local COM connection; और subscription हटाने के लिए Unregister-Event। ↩ ↩2 ↩3 ↩4

  8. Microsoft Learn, Win32_ProcessStartTrace class. इस पर कि यह नए process के start को दर्शाने वाली event class है, properties में ProcessName / ProcessID / ParentProcessID / SessionID / Sid आदि; SECURITY_DESCRIPTOR property वह descriptor है जिससे event provider तय करता है कौन से users event प्राप्त कर सकते हैं; और namespace Root\CIMV2 है, kernel trace provider (Krnlprov.dll) देता है। ↩ ↩2 ↩3

  9. Microsoft Learn, Win32_LogicalDisk class. इस पर कि Win32_LogicalDisk CIM_LogicalDisk से व्युत्पन्न local storage device की class है; DriveType के मान (2 = removable, 3 = local disk, 4 = network drive, 5 = CD आदि); FreeSpace / Size uint64 byte मान हैं; DeviceID key है; और DriveType = 3 से छानने वाले VBScript / C# query उदाहरण। ↩ ↩2 ↩3 ↩4

  10. Microsoft Learn, Installation and configuration for Windows Remote Management. इस पर कि default से WinRM listener configure नहीं होता इसलिए WS-Management messages भेजे-प्राप्त नहीं हो सकते; winrm quickconfig service automatic start, HTTP/HTTPS listener configure, और firewall exception register करता है; WinRM 2.0 के default ports HTTP 5985 / HTTPS 5986 हैं; workgroup आदि में mutual authentication (Kerberos) न स्थापित हो तो TrustedHosts यथासंभव सीमित रखें; और listener की remote पहुँच नियंत्रित करने वाला default security descriptor (RootSDDL), तथा non-admin users को WMI plug-in उपयोग की अनुमति देने का extra configuration। ↩ ↩2 ↩3 ↩4

  11. Microsoft Learn, System.Management Namespace. इस पर कि यह namespace WMI आधार की query ManagementObjectSearcher परिवार से, और event subscription ManagementEventWatcher से करता है; WqlEventQuery WQL रूप की event query व्यक्त करता है; और ManagementDateTimeConverter DMTF date-time तथा अंतराल और CLR के DateTime / TimeSpan का पारस्परिक conversion देता है। ↩ ↩2 ↩3

  12. Microsoft Learn, Requesting WMI Data on a 64-bit Platform. इस पर कि provider 32-bit और 64-bit दोनों रूप में हो तो default से 32-bit app (scripts सहित) को 32-bit provider, 64-bit app को 64-bit provider उत्तर देता है; context के __ProviderArchitecture (32 या 64) और __RequiredArchitecture से non-default provider माँग या बाध्य कर सकते हैं (बाध्य करते संबंधित रूप न हो तो WBEM_E_PROVIDER_LOAD_FAILURE); और registry-provider उदाहरण में 32-bit client HKLM\SOFTWARE\Wow6432Node पक्ष का data पाता है। ↩ ↩2 ↩3

  13. Microsoft Learn, winmgmt. इस पर कि winmgmt.exe का /verifyrepository WMI repository की consistency जाँच करता है; /salvagerepository consistency जाँच कर inconsistency मिलने पर repository rebuild करता है और पढ़ी जा सकी सामग्री merge करता है; /resetrepository OS प्रारंभिक स्थापना की अवस्था पर लौटाता है; repository Repository folder की files से बना database है; और WMI से आने वाली error कभी OS के अन्य भाग से होती है, इसलिए पहला उपाय repository delete नहीं करना चाहिए क्योंकि उससे system या स्थापित apps को क्षति पहुँच सकती है। ↩ ↩2 ↩3

निकटवर्ती विषयों में गहराई से जाने के लिए समान टैग वाले नवीनतम लेख।

ये पृष्ठ विषय को सेवाओं और निर्णयों के व्यापक संदर्भ में रखते हैं।

यह लेख निम्नलिखित सेवाओं से सीधे जुड़ा है।

अक्सर पूछे जाने वाले प्रश्न

इस लेख के विषय पर परामर्श में अक्सर पूछे जाने वाले प्रश्न।

WMI और CIM में क्या अंतर है?
CIM वह industry-standard model है जिससे systems और devices जैसे management targets को व्यक्त किया जाता है, और इसे DMTF (Distributed Management Task Force) तय और रखता है। WMI उस standard का उपयोग करने वाली WBEM पहल का Microsoft implementation है, और वह Windows में बना होता है। अर्थात CIM specification है, WMI Windows पर implementation। PowerShell का Get-CimInstance और C# का Microsoft.Management.Infrastructure स्वयं को CIM कहते हैं क्योंकि वे इस standard के API हैं, पर जुड़ते वही underlying WMI से हैं। रोज़ के development में इतना काफी है कि WMI classes (Win32_* आदि) को CIM-परिवार API से query करते हैं।
क्या Get-WmiObject अब उपयोग नहीं हो सकता?
Windows PowerShell 5.1 में अभी चलता है, पर PowerShell 6 से आगे (वर्तमान PowerShell 7 सहित) WMI v1 cmdlets — Get-WmiObject, Invoke-WmiMethod, Register-WmiEvent, Set-WmiInstance, और Remove-WmiObject — हटा दिए गए हैं और चल नहीं सकते। वही कार्य CimCmdlets module (Get-CimInstance / Invoke-CimMethod / Register-CimIndicationEvent आदि) देता है। नए scripts लिखते समय, 5.1 पर चलाने हों तब भी CIM cmdlets से लिखना सुरक्षित है। ऐसा करने पर बाद में PowerShell 7 पर migrate करते WMI भाग दोबारा नहीं लिखना पड़ता।
C# से WMI के लिए System.Management लें या Microsoft.Management.Infrastructure?
दोनों केवल Windows हैं, और वर्तमान .NET से NuGet package के रूप में आते हैं। System.Management classic API है — ManagementObjectSearcher को WQL दे देना काफी है — और local जानकारी लेना मुख्य काम हो तो अकेले पर्याप्त है। DMTF dates बदलने वाला ManagementDateTimeConverter भी इसी में है। दूसरी ओर Microsoft.Management.Infrastructure (MI API) PowerShell के CIM cmdlets जैसा ही type तंत्र (CimSession / CimInstance) रखता है, और WSMan पर remote query, async methods, और event subscription (Subscribe) एक ही ढाँचे में सँभालता है। Remote PC query और monitoring को product में सचमुच जोड़ रहे हों तो MI API चुनना तर्कसंगत है।
Get-CimInstance remote PC से जुड़ता नहीं। क्या जाँचें?
पहले target machine पर WinRM configure है या नहीं जाँचें। -ComputerName वाला CIM operation WSMan (WinRM) protocol पर अस्थायी session बनाता है, इसलिए target पर WinRM service और listener चलना पूर्वापेक्षा है। winrm quickconfig default configuration (service शुरू करना, listener बनाना, firewall exception) एक साथ करता है। Default ports HTTP 5985 और HTTPS 5986 हैं, इसलिए मार्ग के firewall भी देखें। Workgroup में Kerberos से mutual authentication नहीं होता, इसलिए client की TrustedHosts सूची में target register करना पड़ सकता है। जिस target पर WinRM बिलकुल configure न कर सकें, वहाँ New-CimSessionOption -Protocol Dcom से बना option लेकर DCOM पर जुड़ सकते हैं।
WMI date 20260801100000.000000+540 जैसे रूप में क्यों लौटती है?
WMI dates DMTF CIM specification की string रूप (yyyymmddHHMMSS.mmmmmm±UUU, अंत UTC से मिनटों में offset) में stored होती हैं। पुराने Get-WmiObject या System.Management से कच्चा मान पढ़ें तो यही string ज्यों की त्यों मिलती है। C# (System.Management) में ManagementDateTimeConverter DMTF रूप और DateTime / TimeSpan के बीच conversion देता है, इसलिए string खुद काट-छाँटने के बजाय उसे उपयोग करें। ध्यान दें कि Get-CimInstance जैसे CIM-परिवार API से लेने पर date properties पहले से DateTime में convert लौटते हैं, इसलिए यह समस्या उठती ही नहीं।

लेखक की प्रोफ़ाइल

लेख के लेखक का परिचय पृष्ठ।

Go Komura

KomuraSoft LLC के प्रतिनिधि

Windows सॉफ़्टवेयर विकास, तकनीकी परामर्श और बग जाँच में विशेषज्ञ, विशेष रूप से मौजूदा सिस्टम वाली परियोजनाओं और पुनरुत्पादन में कठिन बग में।

सार्वजनिक लिंक

ब्लॉग पर लौटें