Powershell 将Get-WmiObject替换为Get-CimInstance

Powershell 将Get-WmiObject替换为Get-CimInstance,powershell,wmi,dcom,cim,Powershell,Wmi,Dcom,Cim,我们正在检查代码,并尝试用CIM cmdlet替换WMI cmdlet。以下代码可以正常工作: $Query = "SELECT InstalledLocation,ProductVersion,ProductName FROM SMS_R_System JOIN SMS_G_SYSTEM_Installed_Software on SMS_R_System.ResourceID = SMS_G_SYSTEM_Installed_Software.ResourceID WHERE

我们正在检查代码,并尝试用CIM cmdlet替换WMI cmdlet。以下代码可以正常工作:

$Query = "SELECT InstalledLocation,ProductVersion,ProductName FROM SMS_R_System
JOIN
    SMS_G_SYSTEM_Installed_Software on SMS_R_System.ResourceID =
    SMS_G_SYSTEM_Installed_Software.ResourceID
WHERE SMS_R_SYSTEM.Name=""$C"" "

Get-WmiObject -ComputerName $SCCMServer -Namespace $SCCMNameSpace -Query $Query
由于WMI默认使用DCOM,因此我们认为它与使用以下内容一样简单:

$CimSessionOption = New-CimSessionOption –Protocol DCOM
$CimSession = New-CimSession -ComputerName $SCCMServer -SessionOption $CimSessionOption
Get-CimInstance -CimSession $CimSession -Namespace $SCCMNameSpace -Query $Query
但是我们收到错误
New CimSession:Access denied
,尽管我们使用的是相同的连接协议


这里有什么明显的缺失吗?

我很重视你的想法,但我想知道你为什么要寻求这种转变。此外,WMI权限通过DCOM进行控制。如果不想干扰DCOM权限,可以设置受约束的委托会话,并授予非管理员用户使用该会话的权限。您可以在会话上设置约束,以便它们只能运行Get-CimInstance cmdlet或您指定的任何其他cmdlet、函数或脚本,然后让命令在一组委派的管理员凭据下运行。问题是我没有在计算机上更改任何内容的权限。我的想法是,如果
Get-WmiObject
可以做到这一点,那么更新的
Get-CimInstance
也应该能够做到……感谢您的及时响应。从技术上讲,不一样。它封装了另一层,在
cim
上有一个大大的增强,超过了
wmi
。我听说你@RanadipDutta,所以我的请求似乎不可能实现。在这种情况下,我们必须坚持使用
WMI
。谢谢你的洞察力,非常感谢。@DarkLite1:再加上。CIM cmdlet使用不同的.NET类创建WMI cmdlet
Get-WmiObject Win32_DiskDrive
Get-WmiObject CIM_DiskDrive
返回相同的对象,但CIM是Win32的一个超类