PowerShell Workflow: идентификация результатов запроса удаленных компьютеров

Рабочие процессы (workflows) позволяют работать с множеством компьютеров параллельно, однако при определенных запросах бывает сложно идентифицировать с какого компьютера какая информация получена. В этом посте я приведу несколько вариантов решения этой задачи.

Для примера возьмем следующий скрипт.

workflow Get-WFInfo
{
parallel
{
Get-CimInstance -ClassName win32_BaseBoard
Get-CimInstance -ClassName win32_bios
Get-NetAdapter
Get-Disk
Get-Partition
}
}

Если мы запустим его с параметром -PSComputerName, то том самым мы проинформируем рабочий процесс о том, что мы хотим получить результаты указанных в тексте запросов с определенных компьютеров. Однако, если мы его запустим, например, следующим образом:

Get-WFInfo -PSComputerName comp1,comp2

То получим информацию об экземплярах классов: win32_BaseBoard, win32_bios, MSFT_NetAdapter, MSFT_Disk и MSFT_Partition с компьютеров comp1 и comp2, как нам и требовалось, однако не все из этих объектов будут содержать информацию о том, с какого компьютера они получены.

Для примера, давайте зададим следующую команду.

Get-WFInfo -PSComputerName comp1,comp2 | select CimClass,SystemName,PSComputerName

Результаты этой команды будут содержать только название класса — CimClass, и два значения двух свойств — SystemName и PSComputerName, которые в определенных случаю будут содержать имя компьютера, что поможет нам уменьшить количество выводимой информации и сконтентрировать внимание только на тех значениях, которые нам нужны.

01

Как видно из рисунка, свойство PSComputerName содержит имя компьютера только в случае использования командлета (хотя, в данном случае — активности) Get-CimInstance.
Кроме того, класс MSFT_NetAdapter обладает свойством SystemName, что в данном случае также помогает идентифицировать источник информации.
Однако, что касается запросов Get-Disk и Get-Partition, то здесь соотнести полученные результаты и запрашиваемые компьютеры представляется затруднительным.

Мы можем модифицировать рабочий процесс следущим образом.

workflow Get-WFInfo
{
foreach -parallel ($comp in $PSComputername)
{
parallel
{
Get-CimInstance -ClassName win32_BaseBoard
Get-CimInstance -ClassName win32_bios
Get-NetAdapter
Get-Disk -CimSession $comp
Get-Partition -CimSession $comp
}
}
}

Тогда свойство PSComputerName будет содержать имена компьютеров для всех запросов — кроме Get-NetAdapter, поскольку в этом случае для идентификации мы можем использовать свойство SystemName. Однако, в целях единообразия нам ничто не мешает добавить параметр -CimSession $comp и к команде Get-NetAdapter.

02

Принимая во внимание, что при работе с несколькими компьютерами, обращения к ним происходят параллельно без каких-либо дополнительных указаний в тексте рабочего процесса, использование foreach -parallel для всех запросов мне кажется излишним. Поэтому мы можем вынести первые три запроса в отдельный блок parallel.

workflow Get-WFInfo
{
parallel
{
Get-CimInstance -ClassName win32_BaseBoard
Get-CimInstance -ClassName win32_bios
Get-NetAdapter
}

foreach -parallel ($comp in $PSComputername)
{
parallel
{
Get-Disk -CimSession $comp
Get-Partition -CimSession $comp
}
}
}

03

И все таки, мы можем еще больше упростить наш рабочий процесс.

workflow Get-WFInfo
{
parallel
{
Get-CimInstance -ClassName win32_BaseBoard
Get-CimInstance -ClassName win32_bios
Get-NetAdapter

Get-Disk -CimSession $PSComputerName
Get-Partition -CimSession $PSComputerName
}
}

Как уже было сказано, при запросе нескольких компьютеров, рабочий процесс обращается к каждому из них параллельно, и также параллельно выполняет активности указанные в блоке parallel.
Тот факт, что мы указали переменную $PSComputerName в качестве значения параметра -CimSession позволяет нам получить имя компьютера в качестве значения свойства PSComputerName возвращаемого объекта.

Cтоит отметить, что в данном случае при обращении к каждому конкретному компьютеру переменная $PSComputerName в командах Get-Disk и Get-Partition будет содержать имя только этого компьютера.

04


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s