In PowerShell an accelerator is a shortcut to a .NET type. The WMI accelerators have been around since PowerShell v1. The WMI accelerators were heavily used in v1 fill some of the gaps in cmdlet coverage. The CIM accelerators appeared in PowerShell v3 (I think – only discovered them recently!). This is how you use the WMI and CIM accelerators.
There are three WMI accelerators
wmiclass is shortcut for System.Management.ManagementClass
wmi is shortcut for System.Management.ManagementObject
wmisearcher is shortcut for System.Management.ManagementObjectSearcher
And four CIM accelerators are
ciminstance is shortcut for Microsoft.Management.Infrastructure.CimInstance
cimclass is shortcut for Microsoft.Management.Infrastructure.CimClass
cimtype is shortcut for Microsoft.Management.Infrastructure.CimType
cimconverter is shortcut for Microsoft.Management.Infrastructure.CimConverter
plus
CimSession which is a shortcut for Microsoft.Management.Infrastructure.CimSession. Use this to set a parameter type.
Notice that there isn’t a direct correspondence between the WMI and CIM accelerators.
PowerShell v6 only has the CIM accelerators
The WMI accelerators are used like this:
WMICLASS
This can be used for creating new instances of CIM classes
PS> $p = [wmiclass]’Win32_Process’
PS> $p.Create(“notepad.exe”)
This is easily replicated using the CIM cmdlets
PS> Invoke-CimMethod -ClassName Win32_Process -MethodName create -Arguments @{CommandLine=’notepad.exe’}
WMI
The [wmi] accelerator is used to find an instance BUT you have to use the class key!
PS> [wmi]”root\cimv2:Win32_Process.Handle=’7264′”
NOTE the handle has to be the one reported by CIM NOT the one reported by Get-Process!
Its much easier to use Get-CimInstance and filter on the name
Get-CimInstance -ClassName Win32_Process -Filter “Name=’pwsh.exe'”
WMISEARCHER
This is used to find CIM instances:
PS> $query = [wmisearcher]”SELECT * FROM Win32_Process WHERE Name=’pwsh.exe'”
PS> $query.Get()
Its easier to use Get-CIMinstance these days
PS> Get-CimInstance -ClassName Win32_Process -Filter “Name=’pwsh.exe'”
Looking at the CIM accelerators
CIMINSTANCE
This one doesn’t seem to be usable for anything but a type decorator on a parameter.
CIMCLASS
Using Get-CimClass
PS> Get-CimClass -ClassName Win32_process | fl
CimSuperClassName : CIM_Process
CimSuperClass : ROOT/cimv2:CIM_Process
CimClassProperties : {Caption, Description, InstallDate, Name…}
CimClassQualifiers : {Locale, UUID, CreateBy, DeleteBy…}
CimClassMethods : {Create, Terminate, GetOwner, GetOwnerSid…}
CimSystemProperties : Microsoft.Management.Infrastructure.CimSystemProperties
CimClassName : Win32_Process
The output is of type Microsoft.Management.Infrastructure.CimClass for which cimclass is an accelerator BUT there doesn’t seem to be a way to use the accelerator to access a class. I think this one is only usable as a type on a parameter for a function where you want to pass in a CIM class object.
CIMTYPE
Microsoft.Management.Infrastructure.CimType is an enum that contains the CIM (and WMI) datatypes:
PS> [cimtype]::Boolean
Boolean
PS> [cimtype]::UInt32
UInt32
The full set of CIM data types is
PS> [enum]::GetNames([cimtype])
Unknown
Boolean
UInt8
SInt8
UInt16
SInt16
UInt32
SInt32
UInt64
SInt64
Real32
Real64
Char16
DateTime
String
Reference
Instance
BooleanArray
UInt8Array
SInt8Array
UInt16Array
SInt16Array
UInt32Array
SInt32Array
UInt64Array
SInt64Array
Real32Array
Real64Array
Char16Array
DateTimeArray
StringArray
ReferenceArray
InstanceArray
CIMCONVERTOR
Some of the CIM data types shown above don’t directly correspond to .NET types you’re used to from PowerShell. You can use [cimconvertor] which is shortcut for Microsoft.Management.Infrastructure.CimConverter to discover the corresponding .NET or CIM data type
.NET to CIM
PS> [cimconverter]::GetCimType([int32])
SInt32
PS> [cimconverter]::GetCimType([double])
Real64
CIM to .NET
PS> [cimconverter]::GetDotNetType([cimtype]::SInt32)
IsPublic IsSerial Name BaseType
——– ——– —- ——–
True True Int32 System.ValueType
PS> [cimconverter]::GetDotNetType([cimtype]::Instance)
IsPublic IsSerial Name BaseType
——– ——– —- ——–
True True CimInstance System.Object
For the most part I think the WMI and CIM accelerators are best ignored. Use the CIM cmdlets instead. The cimtype and cimconverter accelerators are useful when developing code to check on types between CIM and .NET