CIM и WMI возвращают различную информацию
Я пытался воспользоваться преимуществами встроенной параллельной обработки 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
1 ответ
Один и тот же WMI-класс должен возвращать те же данные (однако CIM-командлеты конвертируют даты ++). Поскольку вы не объяснили, в чем отличие, я думаю, что на некоторых компьютерах отсутствует вывод. Обычно это происходит потому, что на целевом компьютере отсутствует Windows Management Framework 3.0 или более поздняя версия (например, PS 3.0+), необходимая для CIM. В этом случае должна появиться ошибка, которую вы можете перехватить и использовать для использования DCOM (такой же, как WMI) в качестве запасного варианта. Пример:
$Computer = Get-Content -Path c:\Scripts\input.txt
$DCOM = New-CimSessionOption -Protocol Dcom
$Objects = ForEach($ComputerName in $Computer)
{
#New Cim Instance with fallback to DCOM
Write-Host Collecting information on $ComputerName
$Cim = $null
try {
$Cim = New-CimSession -ComputerName $ComputerName -ErrorAction Stop
} catch [Microsoft.Management.Infrastructure.CimException] {
#CIM not available on target (requires WMF 3.0+). Using DCOM (used by WMI)
try { $Cim = New-CimSession -ComputerName $ComputerName -SessionOption $DCOM -ErrorAction Stop }
catch { Write-Host $_.Exception.Message }
}
#Collect Printer Info
Get-CimInstance -CimSession $Cim -Class Win32_printer -Property DeviceID, DriverName, PortName, SystemName
#Best practice to store the original object.
#No need to create a new one with a few properties when you do it during export anyways.
#If you really need it, add "| Select-Object -Property DeviceID, DriverName, PortName, SystemName" to the previous line
}
#Export Results
$Objects | Select-Object -Property DeviceID, DriverName, PortName, SystemName | Export-Csv - NoTypeInformation -Path c:\Scripts\output.csv