Powershell 无法在通过直连VPN连接的计算机上运行Get-WmiObject
尝试运行上述操作以从机器列表中收集信息时,遇到了两个问题:首先,我可以从直接连接到网络的机器中获取信息,但我们在直连VPN上的机器从get WmiObjectcommand中获取“无法联系RPC服务器”错误;其次,当我知道它们不同时,我得到的结果似乎都是一样的,所以有些地方出了问题。尝试使用CIM cmdlet而不是旧式Powershell 无法在通过直连VPN连接的计算机上运行Get-WmiObject,powershell,wmi,vpn,Powershell,Wmi,Vpn,尝试运行上述操作以从机器列表中收集信息时,遇到了两个问题:首先,我可以从直接连接到网络的机器中获取信息,但我们在直连VPN上的机器从get WmiObjectcommand中获取“无法联系RPC服务器”错误;其次,当我知道它们不同时,我得到的结果似乎都是一样的,所以有些地方出了问题。尝试使用CIM cmdlet而不是旧式获取WMIObject。在这种情况下,Get-CimInstance可以直接替代 我猜在不同的网络路径下会出现防火墙问题`Get-WMIObject在Windows PowerS
获取WMIObject
。在这种情况下,Get-CimInstance
可以直接替代
我猜在不同的网络路径下会出现防火墙问题`Get-WMIObject在Windows PowerShell中已弃用,并已从PowerShell核心中删除
直截了当的例子:
$adminaccount = "DOMAIN\USERNAME"
$PASSWORD = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD
$Machines = Get-Content -Path "C:\Temp\production computers.txt"
$Result = Foreach ($Machine in $Machines){
New-Object -TypeName PSObject -Property @{
$hardware = Get-WmiObject Win32_ComputerSystem -ComputerName $Machine -Credential $UNPASSWORD
$os = Get-WmiObject Win32_OperatingSystem -ComputerName $Machine -Credential $UNPASSWORD
Computer = $Machine
Manufacturer = $hardware.Manufacturer
Model = $hardware.Model
OS = $os.Caption
}| Select-Object Computer,Manufacturer,Model,OS
}
$Result | Export-Csv -Path "C:\Temp\pcsinventory.csv" -NoTypeInformation
我使用较新的[PSCustomObject]
强制转换更改了一些语法。我还将I WMI查询移出了自定义对象声明。它们不需要在那里,这样就不需要Select Object
命令。这是因为现在对象中唯一的属性是您无论如何都会选择的属性
即使Cim不能解决这个问题,它也确实是一条路要走。看看哪个会给你一个好的开始
更新以在CIM中使用凭据:
$adminaccount = "DOMAIN\USERNAME"
$PASSWORD = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD
$hwProps = 'manufacturer','Model'
$Machines = Get-Content -Path "C:\Temp\production computers.txt"
$Result = Foreach ($Machine in $Machines){
$hw = Get-CimInstance Win32_ComputerSystem -ComputerName $Machine -Property $hwProps -Credential $UNPASSWORD
$os = Get-CimInstance Win32_OperatingSystem -ComputerName $Machine -Credential $UNPASSWORD
[PSCustomObject]@{
Computer = $Machine
Manufacturer = $hw.Manufacturer
Model = $hw.Model
OS = $os.Caption
}
}
$Result | Export-Csv -Path "C:\Temp\pcsinventory.csv" -NoTypeInformation
上述更新使用带有
-Credential
参数的新CimSession
。然后它指定-CimSession$CimSession
而不是-ComputerName…
。在我最初的示例中,凭证被忽略了。注意:使用CIM会话实际上比使用-ComputerName…
重复命令更有效。后者在引擎盖下创建一个CIM会话,因此每次迭代都会创建并删除一个会话,方法是重用一个会话,这样做的次数会减少…尝试使用CIM cmdlet,而不是旧式Get WMIObject
。在这种情况下,Get-CimInstance
可以直接替代
我猜在不同的网络路径下会出现防火墙问题`Get-WMIObject在Windows PowerShell中已弃用,并已从PowerShell核心中删除
直截了当的例子:
$adminaccount = "DOMAIN\USERNAME"
$PASSWORD = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD
$Machines = Get-Content -Path "C:\Temp\production computers.txt"
$Result = Foreach ($Machine in $Machines){
New-Object -TypeName PSObject -Property @{
$hardware = Get-WmiObject Win32_ComputerSystem -ComputerName $Machine -Credential $UNPASSWORD
$os = Get-WmiObject Win32_OperatingSystem -ComputerName $Machine -Credential $UNPASSWORD
Computer = $Machine
Manufacturer = $hardware.Manufacturer
Model = $hardware.Model
OS = $os.Caption
}| Select-Object Computer,Manufacturer,Model,OS
}
$Result | Export-Csv -Path "C:\Temp\pcsinventory.csv" -NoTypeInformation
我使用较新的[PSCustomObject]
强制转换更改了一些语法。我还将I WMI查询移出了自定义对象声明。它们不需要在那里,这样就不需要Select Object
命令。这是因为现在对象中唯一的属性是您无论如何都会选择的属性
即使Cim不能解决这个问题,它也确实是一条路要走。看看哪个会给你一个好的开始
更新以在CIM中使用凭据:
$adminaccount = "DOMAIN\USERNAME"
$PASSWORD = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD
$hwProps = 'manufacturer','Model'
$Machines = Get-Content -Path "C:\Temp\production computers.txt"
$Result = Foreach ($Machine in $Machines){
$hw = Get-CimInstance Win32_ComputerSystem -ComputerName $Machine -Property $hwProps -Credential $UNPASSWORD
$os = Get-CimInstance Win32_OperatingSystem -ComputerName $Machine -Credential $UNPASSWORD
[PSCustomObject]@{
Computer = $Machine
Manufacturer = $hw.Manufacturer
Model = $hw.Model
OS = $os.Caption
}
}
$Result | Export-Csv -Path "C:\Temp\pcsinventory.csv" -NoTypeInformation
上述更新使用带有
-Credential
参数的新CimSession
。然后它指定-CimSession$CimSession
而不是-ComputerName…
。在我最初的示例中,凭证被忽略了。注意:使用CIM会话实际上比使用-ComputerName…
重复命令更有效。后者会在引擎盖下创建一个CIM会话,因此每次迭代都会创建并删除一个会话,通过重用会话,您可以减少会话的次数…如果网络路径不同,是否会出现FW问题?您应该尝试获取CimInstance
,而不是获取WmiObject
。后者已被弃用,并从最新版本的PoSh中删除。其中一个原因是底层DCOM/RPC协议对FW不友好。考虑到不同的网络路径,是否可能存在FW问题?您应该尝试获取CimInstance
,而不是获取WmiObject
。后者已被弃用,并从最新版本的PoSh中删除。其中一个原因是底层DCOM/RPC协议对FW不友好。类Win32\u ComputerSystem
和Get CIMInstance
存在已知问题-它在该类中返回的内容之一是OEM徽标的位图,这会导致getcimpinstance
失败,而getwmioobject
没有失败。唯一的解决方法是在调用Get cimpinstance
时指定您感兴趣的特定对象属性。我没有意识到这一点,谢谢您的提醒。本地OEMLogoBitmap不会为我返回。缩小返回属性的范围没有什么害处。我对样本进行了编辑。当然,这样做的另一个好处是返回的数据应该更小,性能应该会略有提高。正因为如此,语法清理似乎已经解决了我得到的重复结果,然而,我似乎根本无法让getcimpinstance
工作,即使在getwmiobject
以前工作过的机器上也是如此。一个明显的错误是Get-cimpinstance
不接受-Credentials开关。我会一直用CIM堵住插头,直到有东西粘住为止!对不起,我错过了信用卡。我添加了第二个示例和附加注释,以帮助您克服这个问题。让我知道它是如何运行的。好吧,最新的更新是,我有了新的CimSession
,当我从一台机器到一个域控制器进行操作时,它可以工作并获取信息,但我无法让它以另一种方式连接回来。这肯定是某种形式的防火墙欺骗,尽管我们确实通过GP打开了域防火墙!类Win32\u ComputerSystem
和Get-CIMInstance
存在已知问题-它在该类中返回的内容之一是OEM徽标的位图,这会导致Get-CIMInstance
在Get-WMIObject
没有的情况下失败。唯一的解决方法是在调用Get cimpinstance
时指定您感兴趣的特定对象属性。我没有意识到这一点,谢谢您的提醒。本地OEMLogoBitmap不会为我返回。缩小返回道具的范围没有什么害处