none
Получение списка устройств RRS feed

  • Вопрос

  • Добрый день.
    Есть функция получения списка usb устройств с машин в сети.

    function Get-USB {
      
        $datapoles = Get-Content "C:\temp\computers.txt" 
        foreach ($datapole in $datapoles)
        {
      $USB = Get-WmiObject Win32_USBControllerDevice -ComputerName $datapole -Impersonation Impersonate -Authentication PacketPrivacy | 
            Foreach-Object { [Wmi]$_.Dependent } | Export-Csv -path "c:\spisok1.csv" -NoTypeInformation -Encoding unicode -Delimiter ":" -Append
        }
                     }

    Все было бы хорошо, если бы по списку машин было порядка 100.

    Но необходимо получать данные с большого списка, в котором тысячи машин. Растягивается это на довольно продолжительный срок.

    Можно ли каким-то образом ускорить процесс получения списка устройств? 

    Также интересует: существует ли возможность добавить вывод только примапленных устройств?


Ответы

  • sccm и политики это простой вариант, при этом sccm еще и правильный. но если хотите хардкора то можно и так.

    Свой список разбиваете по 10 машин через for или foreach не важно, проверяете доступность машинки например через test-connection и для каждого запроса создаете новый job.

    После того как 10 job'ов создано ждете выполнения этой десятки, получаете результаты и переходите к следующим 10.

    В результате время должно сократиться раз в 8

    стоит так же понимать что машинка на которой будет это все выполняться может довольно сильно просесть по ресурсам (проц, память, сеть)

    Если вам нужно проводить процедуру довольно часто, можно попробовать поиграться с количеством джобов, но это может привести к нестабильной работе из-за переполнения различных буферов, и количества одновременных подключений

    Так же есть другой, менее ресурсоемкий вариант - задачи выполнять на самих машинах, но в таком случае вам нужно будет решать вопрос с winrm, версиями клиентов, антивирусами на клиентах (возможно) и пр.

    $i = 0
    $jobs = @()
    
    $datapoles = Get-Content "C:\temp\computers.txt" 
    foreach ($datapole in $datapoles){
        if (test-connection -Computername $datapole -count 1 -quiet){
            $jobs += start-job -scriptblock {
    			Get-WmiObject Win32_USBControllerDevice -ComputerName $ARGS[0] -Impersonation Impersonate -Authentication PacketPrivacy | 
    			Foreach-Object { [Wmi]$_.Dependent }
    		} -ArgumentList $datapole
    		$i++
        }
    	if ($i -eq 10){
    		wait-job -Job $jobs -Timeout 600 | receive-job | Export-Csv -path "c:\spisok1.csv" -NoTypeInformation -Encoding unicode -Delimiter ":" -Append
    		$jobs | remove-job -force -erroraction silentlycontinue
    		$jobs = @()
    		$i = 0
    	}
    }


    The opinion expressed by me is not an official position of Microsoft



    • Изменено Vector BCOModerator 21 мая 2018 г. 6:22
    • Предложено в качестве ответа eclegolas 21 мая 2018 г. 9:22
    • Помечено в качестве ответа Vector BCOModerator 22 мая 2018 г. 17:17
    Модератор

Все ответы

  • политики, sccm?

    чо хотим в итоге?

  • Политики и SCCM не вариант.
    В итоге необходимо получать список подключенных к usb устройств по списку компов из файла.

    В идеале с выбором только подключенных\всех устройств(особенно если это поможет ускорить скан).

  • sccm и политики это простой вариант, при этом sccm еще и правильный. но если хотите хардкора то можно и так.

    Свой список разбиваете по 10 машин через for или foreach не важно, проверяете доступность машинки например через test-connection и для каждого запроса создаете новый job.

    После того как 10 job'ов создано ждете выполнения этой десятки, получаете результаты и переходите к следующим 10.

    В результате время должно сократиться раз в 8

    стоит так же понимать что машинка на которой будет это все выполняться может довольно сильно просесть по ресурсам (проц, память, сеть)

    Если вам нужно проводить процедуру довольно часто, можно попробовать поиграться с количеством джобов, но это может привести к нестабильной работе из-за переполнения различных буферов, и количества одновременных подключений

    Так же есть другой, менее ресурсоемкий вариант - задачи выполнять на самих машинах, но в таком случае вам нужно будет решать вопрос с winrm, версиями клиентов, антивирусами на клиентах (возможно) и пр.

    $i = 0
    $jobs = @()
    
    $datapoles = Get-Content "C:\temp\computers.txt" 
    foreach ($datapole in $datapoles){
        if (test-connection -Computername $datapole -count 1 -quiet){
            $jobs += start-job -scriptblock {
    			Get-WmiObject Win32_USBControllerDevice -ComputerName $ARGS[0] -Impersonation Impersonate -Authentication PacketPrivacy | 
    			Foreach-Object { [Wmi]$_.Dependent }
    		} -ArgumentList $datapole
    		$i++
        }
    	if ($i -eq 10){
    		wait-job -Job $jobs -Timeout 600 | receive-job | Export-Csv -path "c:\spisok1.csv" -NoTypeInformation -Encoding unicode -Delimiter ":" -Append
    		$jobs | remove-job -force -erroraction silentlycontinue
    		$jobs = @()
    		$i = 0
    	}
    }


    The opinion expressed by me is not an official position of Microsoft



    • Изменено Vector BCOModerator 21 мая 2018 г. 6:22
    • Предложено в качестве ответа eclegolas 21 мая 2018 г. 9:22
    • Помечено в качестве ответа Vector BCOModerator 22 мая 2018 г. 17:17
    Модератор
  • Добрый день.
    Спасибо, работает.
    Но также интересовал ответ на вопрос, а возможно ли по какому-то признаку или отсортировать или получить список только подключенных устройств, а не всех, что были когда-либо подключены?

    PS через SCCM имеется ввиду на подобии: http://social.technet.microsoft.com/wiki/contents/articles/16666.report-on-computers-that-usb-storage-devices-are-plugged.aspx ?

    • Изменено Enum0x0 28 мая 2018 г. 19:53
  • Добрый день.
    Спасибо, работает.
    Но также интересовал ответ на вопрос, а возможно ли по какому-то признаку или отсортировать или получить список только подключенных устройств, а не всех, что были когда-либо подключены?
    К сожалению не знаю ответа на этот вопрос. Как правило такие вопросы решаются через всякие dlp системы которые позволяют находить, мониторить и по необходимости блокировать usb и не только устройства.

    The opinion expressed by me is not an official position of Microsoft

    Модератор