WMI → CIM Migration (PowerShell 7.x)
All *-WmiObject/*-Wmi* cmdlets and the [wmi*] type accelerators are
removed in PowerShell 7. Migrate to the CIM cmdlets (CimCmdlets module,
shipped in-box).
Cmdlet mapping
| Windows PowerShell 5.1 | PowerShell 7.x |
|---|---|
Get-WmiObject -Class X |
Get-CimInstance -ClassName X |
Get-WmiObject -Query "..." |
Get-CimInstance -Query "..." |
Invoke-WmiMethod |
Invoke-CimMethod |
Set-WmiInstance |
Set-CimInstance / New-CimInstance |
Remove-WmiObject |
Remove-CimInstance |
Register-WmiEvent |
Register-CimIndicationEvent |
[wmi]"path" |
Get-CimInstance by key |
[wmiclass]"class" |
Get-CimClass / Invoke-CimMethod |
[wmisearcher]"query" |
Get-CimInstance -Query |
Key differences (do not do a blind rename)
-Class→-ClassName. The parameter name changed.- Return type differs. CIM returns
Microsoft.Management.Infrastructure.CimInstance, notSystem.Management.ManagementObject. Downstream property access usually works, but:- Method invocation changes:
$obj.SomeMethod($a)(WMI) →Invoke-CimMethod -InputObject $obj -MethodName SomeMethod -Arguments @{ Param = $a }. DateTimeand some enums render differently — verify consumers.
- Method invocation changes:
- Remote access.
-ComputerNameon WMI used DCOM. CIM defaults to WSMan; for DCOM-only targets create a session:$opt = New-CimSessionOption -Protocol Dcom $s = New-CimSession -ComputerName $c -SessionOption $opt Get-CimInstance Win32_Service -CimSession $s - Filtering.
-Filter "Name='x'"works on both; prefer it over client-sideWhere-Objectfor performance.
Example
# 5.1
$svc = Get-WmiObject -Class Win32_Service -Filter "Name='Spooler'"
$svc.StopService()
# 7.x
$svc = Get-CimInstance -ClassName Win32_Service -Filter "Name='Spooler'"
Invoke-CimMethod -InputObject $svc -MethodName StopService
Validation (Rung 4b)
WMI→CIM is read-mostly and best validated by diffing the selected properties actually consumed, not raw objects:
$old = Get-WmiObject Win32_LogicalDisk | Select DeviceID,FreeSpace # on a 5.1 box
$new = Get-CimInstance Win32_LogicalDisk | Select DeviceID,FreeSpace # on pwsh 7
Compare-Object $old $new -Property DeviceID,FreeSpace
Record read-only-diff-clean when the consumed properties match.