Я пытался воспользоваться преимуществами встроенной параллельной обработки CIM, чтобы получить информацию обо всех установленных принтерах для данной подсети компьютеров. Сценарий работает быстрее, чем мой вариант WMI, но не возвращает ту же информацию и не всегда возвращает столько же, сколько вызов Get-WmiObject
.
РЕДАКТИРОВАТЬ: информация, которую отбрасывает скрипт, является информацией обо всех компьютерах.
Вот версия CIM:
$Computer = Get-Content -Path c:\Scripts\input.txt
$Objects = foreach ($ComputerName in $Computer) {
# New CIM Instance
Write-Host Collecting information on $ComputerName
$Cim = New-CimSession -ComputerName $ComputerName
# Collect Printer Info
Get-CimInstance -CimSession $Cim -Class Win32_printer -Property deviceid, drivername, portname, systemName
# Define Hashtable properties
$ObjectProperties = @{
SystemName = $Cim.systemName
DeviceID = $Cim.deviceid
DriverName = $Cim.drivername
PortName = $Cim.portname
}
# Create new object
New-Object PSObject -Property $ObjectProperties
}
# Export Results
$Objects | Select DeviceID, DriverName, PortName, SystemName |
Export-Csv - NoTypeInformation -Path c:\Scripts\output.csv
Вот версия WMI:
$results = @()
$Computer = Get-Content -Path c:\Scripts\input.txt
# Check each computer in the list
foreach ($ComputerName in $Computer) {
$results += Get-WmiObject -Class Win32_printer -cn $ComputerName |
Select deviceid, drivername, portname, systemName
Start-Sleep -Milliseconds 500
}
# Export to CSV file
$Results | Select DeviceID, DriverName, PortName, SystemName |
Export-Csv -NoTypeInformation -Path c:\Scripts\output.csv
Иногда нам нужно запустить этот скрипт для нескольких подсетей. Я перешел к сеансам CIM, потому что он сокращал общий запуск сценария до 5 минут, но если он не собирается возвращать всю информацию, лучше подождать.
Кто-нибудь имеет представление о том, как предотвратить сброс информации CIM?
Следует отметить, что WinRM не включен по умолчанию на этих машинах, и сценарий должен принудительно включить CIM с помощью следующей команды.
& "c:\Scripts\SnIPT\psexec.exe" \\$ComputerName -s -d -n 5 winrm.cmd quickconfig -q -force