我正在尝试编写一个powershell脚本,该脚本将Ping每个AD中的OU中的主机名,输出在线主机名的txt文件,然后使用get - wmiobject获得每个在线系统上的软件列表。我试过了,我似乎无法弄清楚如何将ping系统输出到主机名的txt文件,这样我就可以使用该文件创建软件列表。我对Powershell几乎一无所知,所以我一直试图偷和借,但不知道怎么让它工作。这是我尝试过的。如有任何帮助,我将不胜感激。
Import-Module active*
$rtn = $null
Get-ADComputer -Filter * -Properties * -searchbase "OU=EnterOUstructurehere" |
ForEach-Object {
$rtn = Test-Connection -CN $_.dnshostname -Count 1 -BufferSize 16 -Quiet
IF($rtn -match ‘True’) {write-host -ForegroundColor green $_.dnshostname}
ELSE { Write-host -ForegroundColor red $_.dnshostname }
}
使用Out-file输出名为computers的txt文件。使用Get to从computer.txt文件中取出,然后:
ForEach-Object {Get-WmiObject -Class Win32_Product -Computer $_.Name} | Select-Object Name, Version | Sort-Object Name | Export-CSV "C:Userssteven.e.hendricksOneDrive - US ArmyDesktopSoftware InventorySoftwareInventoryfile.csv" -Append -NoTypeInformation
首先,强制性建议:
-
在PowerShell v3(2012年9月发布)中,CIM cmdlet(例如
Get-CimInstance
)取代了WMI cmdlet(例如Get-WmiObject
)。因此,应该避免使用WMI cmlet,尤其是因为PowerShell (Core) v6+(未来所有的努力都将集中在此)甚至不再具有它们。注意,WMI仍然是CIM cmdlet的基础。要了解更多信息,请参阅此回答。 -
但是,请注意,CIM cmdlet使用与PowerShell的远程处理相同的远程处理基础结构,这与WMI cmdlet的远程处理不同。
您可能正在寻找这样的内容:
Get-ADComputer -Filter * -Properties * -searchbase "OU=EnterOUstructurehere" |
Where-Object { Test-Connection -CN $_.dnshostname -Count 1 -BufferSize 16 -Quiet } |
ForEach-Object {
Get-WmiObject -Class Win32_Product -Computer $_.Name |
Select-Object Name, Version |
Sort-Object Name
} |
Export-Csv -NoTypeInformation "C:pathtoSoftwareInventoryfile.csv"
但是,请注意,您可能需要添加另一个属性来标识每个输出对象中的计算机名称。
还可以通过将计算机名称的数组传递给单个Get-WmiObject
调用
$onlineComputers =
Get-ADComputer -Filter * -Properties * -searchbase "OU=EnterOUstructurehere" |
Where-Object { Test-Connection -CN $_.dnshostname -Count 1 -BufferSize 16 -Quiet }
Get-WmiObject -Class Win32_Product -Computer $onlineComputers.Name |
Select-Object PSComputerName, Name, Version |
Sort-Object PSComputerName, Name |
Export-Csv -NoTypeInformation "C:pathtoSoftwareInventoryfile.csv"