无法在通过直连VPN连接的机器上运行Get-WmiObject


$adminaccount = "DOMAINUSERNAME"
$PASSWORD = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD
$Machines = Get-Content -Path "C:Tempproduction 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:Temppcsinventory.csv" -NoTypeInformation

尝试运行上面的机器列表收集信息,有两个问题:首先,我可以从直接连接到网络的机器获得信息,但我们在直接连接vpn上的机器获得"无法联系RPC服务器";Get-WmiObjectcommand错误;其次,当我知道它们是不同的时候,我得到的结果似乎都是一样的,所以哪里出了问题。

尝试使用CIM cmdlet代替传统的Get-WMIObject。在这种情况下,Get-CimInstance可以直接替代。

考虑到不同的网络路径,我猜有防火墙问题。' Get-WMIObject '在Windows PowerShell中已弃用,并已从PowerShell核心中删除。

直接的例子:

$adminaccount = "DOMAINUSERNAME"
$PASSWORD     = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD   = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD
$hwProps      = 'manufacturer','Model'
$Machines = Get-Content -Path "C:Tempproduction 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:Temppcsinventory.csv" -NoTypeInformation

我改变了一点语法,使用较新的[PSCustomObject]铸造。我还将WMI查询从自定义对象声明中移出。它们不需要在那里,这样就不需要Select-Object命令了。这是因为现在对象中唯一的属性是您无论如何都会选择的属性。

即使Cim不能解决问题,这也是可行的方法。看一下CIM cmdlet介绍,这将给你一个良好的开端…

更新以使用CIM的凭据:

$adminaccount = "DOMAINUSERNAME"
$PASSWORD     = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force
$UNPASSWORD   = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD
$hwProps      = 'manufacturer','Model'
$Machines = Get-Content -Path "C:Tempproduction computers.txt"
$Result = Foreach ($Machine in $Machines){
$CimSession = New-CimSession -ComputerName $Machine -Credential $UNPASSWORD
$hw =  Get-CimInstance Win32_ComputerSystem -CimSession $CimSession -Property $hwProps
$os =  Get-CimInstance Win32_OperatingSystem -CimSession $CimSession

[PSCustomObject]@{    
Computer     = $Machine
Manufacturer = $hw.Manufacturer
Model        = $hw.Model
OS           = $os.Caption
}
}
$Result | Export-Csv -Path "C:Temppcsinventory.csv" -NoTypeInformation

上面的更新使用New-CimSession-Credential参数。然后它指定-CimSession $CimSession而不是-ComputerName...。在最初的示例中忽略了凭证。注意:使用CIM会话实际上比使用-ComputerName...重复命令更有效。后者在底层创建一个CIM会话,因此每次迭代都创建和删除一个会话,通过重用会话,可以减少这样做的次数……

最新更新