CIM и WMI возвращают различную информацию - PullRequest
0 голосов
/ 06 мая 2018

Я пытался воспользоваться преимуществами встроенной параллельной обработки 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 Ответ

0 голосов
/ 06 мая 2018

Один и тот же 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
...