$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会话,因此每次迭代都创建和删除一个会话,通过重用会话,可以减少这样做的次数……