无法 运行 在通过 Direct Connect VPN 连接的计算机上获取 WmiObject

Unable to run Get-WmiObject on machine connected via Direct Connect VPN

$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

尝试 运行 从机器列表中收集信息,遇到两个问题:首先,我可以从直接连接到网络的机器获取信息,但我们在 Direct Connect VPN 上的机器获取来自 Get-WmiObject 命令的“无法联系 RPC 服务器”错误;其次,当我知道它们不同时,我得到的结果似乎都是一样的,所以那里出了问题。

尝试使用 CIM cmdlet 而不是旧版 Get-WMIObject。在这种情况下,Get-CimInstance可以直接替代。

鉴于不同的网络路径,我猜测存在防火墙问题。 `Get-WMIObject 在 Windows PowerShell 中已弃用并已从 PowerShell Core 中删除。

直接示例:

$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

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

即使 Cim 不能解决问题,它也是可行的方法。看看 Introduction to CIM CMdlets 这会给你一个好的开始...

更新以将凭据与 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){
    $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:\Temp\pcsinventory.csv" -NoTypeInformation

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