The CIM cmdlets were introduced with PowerShell 3.0. You can use the –ComputerName parameter to access a remote machine or, if you need to run multiple commands to the remote machine, you can create a CIM session.
CIM sessions are analogous to PowerShell remoting sessions and use WSMAN by default to connect to the remote machine:
PS> $c12 = New-CimSession -ComputerName W12R2SUS
PS> Get-CimInstance -CimSession $c12 -ClassName Win32_OperatingSystem | fl
SystemDirectory : C:\Windows\system32
Organization :
BuildNumber : 9600
RegisteredUser : Windows User
SerialNumber : 00252-00107-57895-AA282
Version : 6.3.9600
PSComputerName : W12R2SUS
In this case I’m accessing a Windows 2012 R2 system
If you try to create a CIM session to a machine running PowerShell 2.0 it will appear to work but you’ll get an error when you try to access the session:
PS> $c8 = New-CimSession -ComputerName W8R2STD01
PS> Get-CimInstance -CimSession $c8 -ClassName Win32_OperatingSystem | fl
Get-CimInstance : The WS-Management service cannot process the request. A DMTF resource URI was used to access a non-DMTF class. Try again using a non-DMTF resource URI.
At line:1 char:1
+ Get-CimInstance -CimSession $c8 -ClassName Win32_OperatingSystem | fl
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (root\cimv2:Win32_OperatingSystem:String) [Get-CimInstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x80338139,Microsoft.Management.Infrastructure.CimCmdlets.GetCimInstanceCommand
+ PSComputerName : W8R2STD01
The reason is that the version of WSMAN installed with with PowerShell 2.0 (WSMAN 2.0) isn’t compatible with CIM sessions which expect WSMAN 3.0
One option is to use a DCOM based session:
PS> $opt = New-CimSessionOption -Protocol Dcom
PS> $c8D = New-CimSession -ComputerName W8R2STD01 -SessionOption $opt
PS> Get-CimInstance -CimSession $c8D -ClassName Win32_OperatingSystem | fl
SystemDirectory : C:\Windows\system32
Organization :
BuildNumber : 7601
RegisteredUser : Windows User
SerialNumber : 00477-179-0000007-84050
Version : 6.1.7601
PSComputerName : W8R2STD01
PowerShell MVP Jeff Hicks discovered that if you use a filter parameter with Get-CimInstance you can access PowerShell 2.0 machines using a WSMAN based CIM session
PS> Get-CimInstance -CimSession $c8 -ClassName Win32_OperatingSystem -Filter "Caption LIKE ‘%’" | fl
SystemDirectory : C:\Windows\system32
Organization :
BuildNumber : 7601
RegisteredUser : Windows User
SerialNumber : 00477-179-0000007-84050
Version : 6.1.7601
PSComputerName : W8R2STD01
In this case you’re filtering on the Caption being like any characters
I stood in for a speaker who was ill at the recent European PowerShell conference and part of the session was on using CIM sessions. This issue came up and I decided to investigate a bit closer
Without a filter:
PS> Get-CimInstance -CimSession $c8 -ClassName Win32_OperatingSystem -Verbose
VERBOSE: Perform operation ‘Enumerate CimInstances’ with following parameters, ”namespaceName’ =
root\cimv2,’className’ = Win32_OperatingSystem’.
Get-CimInstance : The WS-Management service cannot process the request. A DMTF resource URI was used to access a
non-DMTF class. Try again using a non-DMTF resource URI.
At line:1 char:1
+ Get-CimInstance -CimSession $c8 -ClassName Win32_OperatingSystem -Ver …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (root\cimv2:Win32_OperatingSystem:String) [Get-CimInstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x80338139,Microsoft.Management.Infrastructure.CimCmdlets.GetCimInstanceCommand
+ PSComputerName : W8R2STD01
VERBOSE: Operation ‘Enumerate CimInstances’ complete.
An attempt is made to enumerate the instances of the Win32_OperatingSystem class
If you use a filter
PS> Get-CimInstance -CimSession $c8 -ClassName Win32_OperatingSystem -Filter "Caption LIKE ‘%’" -Verbose | fl
VERBOSE: Perform operation ‘Query CimInstances’ with following parameters, ”queryExpression’ = SELECT * FROM
Win32_OperatingSystem WHERE Caption LIKE ‘%’,’queryDialect’ = WQL,’namespaceName’ = root\cimv2′.
SystemDirectory : C:\Windows\system32
Organization :
BuildNumber : 7601
RegisteredUser : Windows User
SerialNumber : 00477-179-0000007-84050
Version : 6.1.7601
PSComputerName : W8R2STD01
VERBOSE: Operation ‘Query CimInstances’ complete.
You’re sending a WQL query to the remote machine.
My current theory is that Get-CimInstance is trying to enumerate the instances of a particular class (in a similar way to Get-WSmnaInstance does) and that fails due to the WSMAN version mismatch. Using the Filter bypasses the enumeration allowing it to work.
This is a totally undocumented feature and there is no guarantee it will continue to work in future versions. Until PowerShell 2.0 is gone from you environment be aware that its an option but be careful