sergey vasin

The IT blog

PowerShell Workflows: Вложения – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Windows PowerShell MVP Richard Siddaway рассказывает о вложении (Nesting) рабочих процессов Windows PowerShell.

Microsoft Scripting Guy, Ed Wilson на связи. Сегодня я публикую третью часть в серии статей о рабочих процессах Windows PowerShell за авторством Windows PowerShell MVP Richard Siddaway.

Заметка: Его первая статья PowerShell Workflows: Основы рассказывает об основных концепциях рабочих процессов Windows PowerShell. Вторая, PowerShell Workflows: Ограничения, рассказывает об ограничениях, с которыми вы можете столкнуться при работе с PowerShell Workflow. Перед чтением данной статьи рекомендуется ознакомиться с первыми двумя.

Richard Siddaway написал несколько гостевых постов, кроме этого он является автором двух книг по Windows PowerShell. Последняя его книга, PowerShell in Depth написана в соавторстве двумя другими MVP – Don Jones и Jeffrey Hicks.

Давай, Ричард.

PowerShell Workflows: Вложения

Пока что я показывал вам, как использовать рабочие процессы по одному в каждый момент времени. Если же вы задумаетесь на минуту, как вы обычно используете WindowsPowerShell, вы вероятно скажете, что вы создаете несколько функций, которые затем используете повторно, вызывая их из других функций и скриптов. Сама концепция повторного использования кода должна пронизывать все ваши скрипты, так, чтобы повысить отдачу от затраченного времени и усилий на написание кода.

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

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

  • Рабочие процессы PowerShell – (возможна интеграция с рабочими процессами, созданными в Visual Studio, но, поскольку это используется весьма небольшим числом администраторов, мы не будем рассматривать этот вопрос в данной серии статей)
  • Функции PowerShell – либо в том же самом скрипте, что и рабочий процесс, либо через использование модулей WindowsPowerShell.
  • Скрипты PowerShell – на локальной или удаленной машине.

Давайте посмотрим, как рабочие процессы могут взаимодействовать с другими рабочим процессами на примере администрирования Active Directory. Рекомендуется очищать неиспользуемые учетные записи в Active Directory. И обычно вы просматриваете Active Directory на предмет отключенных или просроченных аккаунтов, а также учетных записей, со включенным параметром Password Never Expires.

Для определения отключенных учетных записей, запустите следующий скрипт:

Search-ADAccount -AccountDisabled |

Select-Object -Property DistinguishedName |

Export-Csv -Path c:\ADReports\DisabledAccounts.csv –NoTypeInformation

Для просроченных аккаунтов:

Search-ADAccount -AccountExpired |

Select-Object -Property DistinguishedName |

Export-Csv -Path c:\ADReports\ExpiredAccounts.csv –NoTypeInformation

И для учетных записей, пароль которых не устаревает:

Search-ADAccount -PasswordNeverExpires |

Select-Object -Property DistinguishedName |

Export-Csv -Path c:\ADReports\PsswdNeverExpireAccounts.csv –NoTypeInformation

Эти три скрипта должны быть знакомы администраторам Active Directory. Их использовании гораздо более эффективно чем нахождение учетных записей вручную. Но в этом случае, они выполняются последовательно. Могут ли нам помочь рабочие процессы, чтобы выполнить эти три команд параллельно?

При самом простом подходе, эти три скрипта помещаются в один рабочий процесс:

workflow get-ADReport {

 parallel {

 Search-ADAccount -AccountDisabled |

 Select-Object -Property DistinguishedName |

 Export-Csv -Path c:\ADReports\DisabledAccounts.csv -NoTypeInformation

  

 Search-ADAccount -AccountExpired |

  Select-Object -Property DistinguishedName |

  Export-Csv -Path c:\ADReports\ExpiredAccounts.csv -NoTypeInformation

  

 Search-ADAccount -PasswordNeverExpires |

  Select-Object -Property DistinguishedName |

  Export-Csv -Path c:\ADReports\PsswdNeverExpireAccounts.csv -NoTypeInformation

  }

 }

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

Здесь есть пара вариантов. Первый – вы можете создать отдельный рабочий процесс для каждого скрипта и вложить их в один общий рабочий процесс.

workflow get-ADReport {

   workflow get-disabled {

    Search-ADAccount -AccountDisabled |

    Select-Object -Property DistinguishedName |

    Export-Csv -Path c:\ADReports\DisabledAccounts.csv -NoTypeInformation

   }

  

  workflow get-expired {

    Search-ADAccount -AccountExpired |

    Select-Object -Property DistinguishedName |

    Export-Csv -Path c:\ADReports\ExpiredAccounts.csv -NoTypeInformation

   }

  

  workflow get-passwordneverexpire {

    Search-ADAccount -PasswordNeverExpires |

    Select-Object -Property DistinguishedName |

    Export-Csv -Path c:\ADReports\PsswdNeverExpireAccounts.csv -NoTypeInformation

   }

 

  parallel {

    get-disabled

    get-expired

    get-passwordneverexpire

   }

 }

 

Это загрузит каждый рабочий процесс в память и вы сможете использовать их отдельно.

Более простой способ, который также упрощает обслуживание – это вывести отдельные рабочие процессы из общего рабочего процесса:

workflow get-disabled {

  Search-ADAccount -AccountDisabled |

  Select-Object -Property DistinguishedName |

  Export-Csv -Path c:\ADReports\DisabledAccounts.csv -NoTypeInformation

 }

  

workflow get-expired {

  Search-ADAccount -AccountExpired |

  Select-Object -Property DistinguishedName |

  Export-Csv -Path c:\ADReports\ExpiredAccounts.csv -NoTypeInformation

 }

   

workflow get-passwordneverexpire {

  Search-ADAccount -PasswordNeverExpires |

  Select-Object -Property DistinguishedName |

  Export-Csv -Path c:\ADReports\PsswdNeverExpireAccounts.csv -NoTypeInformation

 }

  

workflow get-ADReport {

  parallel {

    get-disabled

    get-expired

    get-passwordneverexpire

  }

}

Следующим шагом может быть помещение каждого рабочего процесса в отдельный файл и создание файла .psm1 для загрузки их в качестве модуля. Таким образом вы можете расширить функциональность без необходимости изменения кода. Чуть раньше я показывал, как запускать эти рабочие процессы параллельно. Приведенный подход позволит вам при необходимости запустить их последовательно. Это может пригодиться, если вам, например, сначала нужно создать учетные записи, а затем создать для них почтовые ящики.

Функции используются похожим образом.

workflow get-computersystem {

 param([string[]]$computerName)

 

 function get-fcomputersystem {

 param ([string]$fcomputer)

 Get-WmiObject -Class Win32_ComputerSystem -ComputerName $fcomputer

}

 

# The contents of the foreach block will be executed in parallel 

  foreach -parallel($computer in $computerName) {

     if (Test-Connection -ComputerName $computer -Quiet -Count 1) {

         get-fcomputersystem -fcomputer $computer

     }

     else {

       «$computer unreachable»

     }

  }

}

 

get-computersystem -computerName $env:COMPUTERNAME

В рабочем процессе список имен компьютеров передается посредством параметра ComputerName. Выражение foreach –parallel используется для обработки этого списка. Test-Connection используется для проверки доступности компьютера, и если он отвечает, вызывается функция.

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

Важный момент состоит в том, что функции и рабочие процессы должны быть загружены или определены до того, как вы их вызываете.

Скрипты – это третий и последний метод повторного использования кода. Поместим скрипты для работы с Active Directory, приведенные в начале статьи в отдельные файлы.

Назовем их:

get-disabledaccount.ps1

get-expiredaccount.ps1

get-passwordNexpire.ps1

Для того, чтобы выполнить их параллельно, можно попробовать запустить следующий скрипт:

workflow get-ADReport {

 parallel {

   c:\adreports\get-disabledaccount.ps1

   c:\adreports\get-expiredaccount.ps1

   c:\adreports\get-passwordNexpire.ps1

 }

}

С сожалению, попытка его выполнения вызовет ошибку:

At line:3 char:4

+    c:\adreports\get-disabledaccount.ps1

+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Cannot find the ‘c:\adreports\get-disabledaccount.ps1’ command. If this

command is defined as a workflow, ensure it is defined before the workflow

that calls it. If it is a command intended to run directly within Windows

PowerShell (or is not available on this system), place it in an InlineScript:

‘InlineScript { c:\adreports\get-disabledaccount.ps1 }’

    + CategoryInfo          : ParserError: (:) [], ParseException

    + FullyQualifiedErrorId : CommandNotFound

Тогда мы можем попробовать так:

workflow get-ADReport {

 inlinescript {

   c:\adreports\get-disabledaccount.ps1

   c:\adreports\get-expiredaccount.ps1

   c:\adreports\get-passwordNexpire.ps1  }

}

Это сработает, но что насчет параллельного выполнения? Для этого нужно запустить каждый скрипт отдельно.

workflow get-ADReport {

 parallel {

  inlinescript {c:\adreports\get-disabledaccount.ps1}

  inlinescript {c:\adreports\get-expiredaccount.ps1}

  inlinescript {c:\adreports\get-passwordNexpire.ps1  }

}

}

Каждая секция InlineScript будет выполняться параллельно.

Но что, если мы захотим запустить скрипты, находящиеся на удаленной машине?

Положите скрипты в папку C:\ADReports на удаленной машине и запустите рабочий процесс следующим образом:

PS> get-ADReport -PSComputerName dc02

Скрипты будут запущены на удаленной машине и, поскольку мы не изменяли их, выходные файлы будут созданы там же. Все рабочие процессы обладают несколькими параметрами. Подробнее о них прочитать можно в файле справки.

Get-Help about_WorkflowCommonParameters

Заключение

Как вы видели в прошлых статьях, рабочие процессы Windows PowerShell могут содержать несколько элементов:

  • Активности рабочих процессов
  • Языковые конструкции рабочих процессов, в частности:

                 Parallel

                 Foreach –parallel

  • Скрипты PowerShell (InlineScript), включающие командлеты и языковые конструкции, для которых не было создано активностей рабочих процессов.

В этой статье было показано как повторно использовать код с применением:

  • Рабочих процессов PowerShell
  • Функций PowerShell
  • Скриптов PowerShell на локальной и удаленных машинах

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

Одно из серьезных достоинств рабочих процессов PowerShell – это то, что их можно останавливать и перезапускать. Это потому, что они используют механизм задач (Job) PowerShell. Это именно то, о чем мы поговорим в следующий раз, включая сохранение состояния рабочих процессов, а также их остановку и перезапуск.

~Richard.

 

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/09/powershell-workflows-nesting.aspx


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

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


Реклама

Written by Сергей Васин

Февраль 5, 2013 в 10:00

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with ,

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s