Марк Минаси (www.minasi.com/gethelp) – старший редактор журнала Windows IT Pro, сертифицированный системный инженер по продуктам Microsoft

. Нам уже известно, что запрос

search-adaccount -usersonly -accountinactive –timespan «90"|select samaccountname,lastlogondate|sort lastlogondate|ft

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

Организовать отправку отчета по нужному электронному адресу позволяет команда send-mailmessage, синтаксис которого по большей части прост, но есть ряд не совсем очевидных параметров. В самом простом варианте запрос send-mailmessage выглядит так:

send-mailmessage -to joe@bigfirm.com -from sue@cogswellcogs.net -cc attorney@win2ktest.com -bcc covermybutt@cogswellcogs.net -subject»Looks good, let's sign it Tuesday at noon«-body»Let's meet at the Pungo Grill and ink this deal.«-smtpserver po.cogswellcogs.net

Запрос представляет собой длинную, но простую строку, и клиент SMTP, как минимум, не должен возражать против того, что здесь написано. Чтобы не вводить имя SMTP-сервера вручную, можно указать его по умолчанию в профиле PowerShell. Для этого создайте папку Users\yourname\Documents\WindowsPowerShell (если таковой еще не существует). В этой папке следует создать текстовый файл с именем Microsoft.Powershell_profile.ps1. Откройте этот файл и добавьте в него следующую строку:

$psemailserver=имяSMTPсервера

Например:

$psemailserver=»mail1.bigfirm.com«

В командной строке PowerShell введите команду:

set-executionpolicy remotesigned

Таким образом, мы изменили или создали профиль PowerShell, то есть текстовый файл, в который можно поместить команды, автоматически выполняемые при каждом запуске PowerShell. Команда set-executionpolicy, которую требуется выполнять только один раз на данном компьютере, открывает возможность запуска сценариев PowerShell (об этом мы еще будем говорить подробнее). Чтобы новый или измененный профиль вступил в силу, закроем и вновь откроем окно PowerShell, а затем введем следующий запрос:

$psemailserver

В ответ PowerShell выдаст на экран текущий SMTP-сервер по умолчанию. Прежде чем идти дальше, протестируем нашу первую команду send-mailmessage, указав локальные учетные записи и имя или IP-адрес локального SMTP-сервера. Неудачный результат проверки может быть связан с настройками безопасности SMTP-сервера. В моем случае настройки позволяют отсылать почту клиенту, устанавливающему соединение из внутренней подсети, либо указывающему доменные учетные данные, поэтому мне учетные данные предъявлять не нужно. Если же ваш SMTP-сервер требует предъявления учетных данных, просто добавьте -credential username для указания зарегистрированного имени пользователя, и вы получите запрос на ввод пароля. Со временем, однако, вам все же придется изменить настройки аутентификации для своего SMTP-сервера, чтобы автоматизировать выполнение данной команды.

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

Прежде всего, чтобы передать несколько строк сообщения, можно указать разрывы с помощью «управляющего кода» PowerShell в виде обратной галочки и строчной буквы n (`n). Пример запроса на передачу сообщения из двух строк приведен ниже:

-body»Meet me at noon.`nI'll be waiting.«

Иногда требуется в качестве тела сообщения передать содержимое файла. Это можно сделать с помощью команды get-content, позволяющей отобразить содержимое файла на экране. Например, запрос

get-content test.txt

выводит на экран содержимое текстового файла test.txt. Логично предположить, что нужного результата можно добиться, если поместить этот запрос в скобки:

-body (get-content test.txt)

Однако то, что выглядит как текст (или System.Text на языке PowerShell), на самом деле является не текстом, а тем, что в терминах. NET и PowerShell называется типом данных System.Object. Это можно исправить, если организовать конвейерную передачу выходных данных запроса get-content на вход команде out-string, которая, как можно догадаться, преобразует данные System.Object в данные System.String, что и дает нужный результат:

send-mailmessage -to joe@bigfirm.com -from sally@bigfirm.com -subject»Here's the report!" -body (get-content c:\files\report.txt|out-string)

Эту строку можно еще сократить, если использовать одно из альтернативных имен get-content: cat, type или gc. Если же требуется передать содержимое не текстового, а HTML-файла, то send-mailmessage отправит его как HTML, если добавить параметр -bodyashtml.

Думаю, что вы уже оценили достоинства send-mailmessage, хотя два важных момента еще не обсуждались. Во-первых, было бы удобно, чтобы текстовым полем сообщения, отсылаемого по электронной почте, был выходной результат выполнения другой команды. Во-вторых, весьма желательна возможность планировать автоматический запуск send-mailmessage. Однако об этом речь пойдет в следующий раз.