В последних статьях рубрики, «Автоматизация отчетов PowerShell, часть 1» и «Автоматизация отчетов PowerShell, часть 2», опубликованных в двух предыдущих номерах журнала, обсуждалась тема применения PowerShell для автоматического создания отчетов Active Directory (AD) и доставки этих отчетов в почтовый ящик. С этой целью исследовались возможности команды PowerShell Send-MailMessage, позволяющие успешно отправлять такие сообщения в современной защищенной инфраструктуре электронной почты. Теперь мы можем с помощью PowerShell организовать ежедневное составление и доставку отчетов.

. Это можно сделать с помощью следующей команды PowerShell:

search-adaccount -usersonly -accountinactive -timespan  «120»|select  samaccountname,lastlogondate|sort lastlogondate|ft -auto 

· Для автоматизации этой операции внесем в команду небольшое изменение, задав вывод результатов в текстовый файл. Добавим команду Send-MailMessage, которая будет использовать этот текстовый файл в качестве тела почтового сообщения, сохраним обе команды в файле с расширением ps1 и запланируем их ежедневный запуск с помощью планировщика заданий:

 powershell -executionpolicy remotesigned -command nameoffile.ps1 

· Файл. рs1 создадим в папке, где хранятся команды PowerShell и построенные отчеты. Я использую папку C:scripts, но возможны любые варианты. Новый текстовый файл создается для сохранения команд PowerShell, которые будут запускать построение отчета. Я назвал свой файл oldusers.ps1. Откроем созданный файл в блокноте Notepad и напечатаем три команды (каждую в отдельной строке):

 import-module activedirectory 
 search-adaccount -usersonly -accountinactive -timespan  «120»|select  samaccountname,lastlogondate|sort lastlogondate|ft -auto > C:scriptsoldusers.txt 
 send-mailmessage -to youremail -from powershell@yourcompany -subject  «Daily  inactive user  report»  -smtpserver yoursmtpservername -body (get-content c:scriptsoldusers.txt|out-string) 

· Первая строка – Import-Module ActiveDirectory – добавлена потому, что командам AD нужен модуль AD. Путь c:scriptsoldusers.txt указывает на текстовый файл, куда следует сохранять результат поиска, выполняемого командой search-adaccount. Повторяю, что можно указать любой файл и папку. Теперь команда send-mailmessage выглядит так же, как те, что обсуждались в предыдущих статьях, но ее необходимо индивидуализировать, указав конкретный адрес электронной почты (youremail), SMTP-сервер (yoursmtpservername) и имя файла для команды get-content (которое должно совпадать с именем файла, заданным для search-adaccount). Например, для пользователя с почтовым адресом joe@bigfirm.com и локальным SMTP-сервером mail.bigfirm.com эти три строки будут выглядеть так:

import-module activedirectory 
search-adaccount -usersonly -accountinactive -timespan  «120»|select  samaccountname,lastlogondate|sort lastlogondate|ft -auto > c:scriptsoldusers.txt 
send-mailmessage -to joe@bigfirm.com -from powershell@bigfirm.com -subject  «Daily  inactive user  report»  -smtpserver mail.bigfirm.com -body (get-content c:scriptsoldusers.txt|out-string) 

· Возникает вопрос, почему здесь не использован конвейер PowerShell с подачей выхода команды search-adaccount на вход send-mailmessage в качестве параметра -body, что позволило бы объединить две строки в одну. Просто я решил, что это сделает команду слишком длинной и плохо читаемой.

Перед тем как запланировать выполнение файла. ps1, полезно провести проверку. По умолчанию Windows не запускает сценарии, поэтому в команду powershell.exe следует включить команду ( executionpolicy remotesigned) для временной отмены запрета. Используйте это при вызове сценария (даже из командной строки PowerShell):

powershell -executionpolicy remotesigned -command scriptname 

· В моем примере это выглядит так:

powershell -executionpolicy remotesigned -command C:scriptsoldusers.txt 

· Если сценарий не сработает и вы не получите сообщения, сначала проверьте правильность синтаксиса. Затем из командной строки PowerShell попробуйте ввести команду search-adaccount без завершающей части, где указано имя файла (>filename). Проверьте еще раз правильность синтаксиса и убедитесь, что ваша учетная запись обладает полномочиями выполнения команды search-adaccount. Как только это будет сделано, выполните команду снова, восстанавливая завершающую часть с именем файла. В результате вы получите файл oldusers.txt (или с другим, выбранным вами, именем) и сможете запустить команду send-mailmessage отдельно. Если ничего не получится, то проблема, вероятно, в настройке разрешения ретрансляции SMTP-сервера. Для ее устранения используйте рекомендации, приведенные в упомянутых выше статьях.

Теперь запланируйте выполнение задания в диспетчере задач. Создайте новую задачу, присвоив ей любое имя, и определите пусковые механизмы Triggers (например, укажите On a schedule (по графику) и частоту выполнения) и действия Actions. В качестве Actions укажите Start a program (запустить программу) (с указанием значения программы/сценария в PowerShell), а в поле Add arguments (добавить аргументы) определите оставшуюся часть команды, как в executionpolicy remotesigned -command C:scriptsoldusers.ps1. Команда должна быть выполнена в системе System, укажите это. После того, как в диспетчере задач запланировано новое задание, можно его запустить, щелкнув правой кнопкой и выбрав Run (Выполнить).

Желаю удачи в создании первого автоматизированного отчета! В следующих статьях я покажу, что еще PowerShell может доставить в ваш почтовый ящик.