Pull to refresh

Автосмена пароля пользователя и автоматическая отправка пароля по смс (PowerShell)

Мои руководством была поставлена задача обеспечить всех удаленных пользователей автоматизированным способом замены их пароля каждый месяц посредством СМС рассылки. Изначально нашим ИТ отделом было решено использовать PowerShell(фермы терминалов построены на базе виртуальных сервером на Windows Server 2012) за гибкость и большие возможности.


Задача была разбита на части:
1. Найти смс-провайдера, который можно бы было как-то связать с PowerShell для отправки смс, ну и разумеется, чтобы стоимость смс была невысокая.
2. Создать сам скрипт на PowerShell.
3. Добавить скрипт в планировщик(scheduler) и настроить расписание работы скрипта.

Для решения 1 задачи была выбрана вот эта компания. Так как компания имеет несколько способов интеграции для отправки СМС.
Один из способов это отправить электронное письмо по шаблону "|логин; пароль;+7......(номер телефона); имя_отправителя; текст сообщения|". Этот способ был выбран как наиболее простой для реализации задачи.

За базу для скрипта был взят пример вот от сюда. Далее на его основе было создано 2 скрипта: один для смены пароля только у одного пользователя; и второй для смены пароля для пользователей, которые входят в определенную группу.

Скрипт PowerShell для смены пароля у одного пользователя:

###Модуль для обращения к AD
import-module activedirectory

###Модуль, который при запуске скрипта спрашивает имя пользователя(логин), у которого должен поменяться пароль
$userset = Read-Host "Введите имя пользователя, у которого будет изменен пароль:"


###Модуль генерации случайного пароля, переменная $len задает длину пароля
[int] $len = 8
[string] $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
$bytes = new-object "System.Byte[]" $len
$rng = new-object System.Security.Cryptography.RNGCryptoServiceProvider
$rng.GetBytes($bytes)
$result = ""
for( $i=0; $i -lt $len; $i++ )
{
$result += $chars[ $bytes[$i] % $chars.Length ]
}
$result

$securestring = ConvertTo-securestring $result -asplaintext -force

### Вместо Newuser вставляем логин своего пользователя из AD(у которого меняется пароль).
$user=Get-ADUser Newuser -properties Mobile
get-aduser $user | set-adaccountpassword -newpassword $securestring
$MobilePhone = $user.Mobile

###Формируем дату(месяц)
$month= get-date -format MMMM

###Настройки почты
$FromAddress = "Здесь указываем Ваш почтовый адрес, поле От кого"

### Тут указана почта вашего смс провайдера
$ToAddress = "email@sms.sms-uslugi.com"

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

$MessageSubject = "Ваш новый пароль на $month"

###Здесь составляем ТЕЛО письма согласно инструкции вашего провайдера
$MessageBody = "|логин;пароль;$MobilePhone;имя_отправителя;Новый пароль $result|"
$SendingServer = "здесь имя вашего почтового домена или его ip"

###Модуль создание письма
$SMTPMessage = New-Object System.Net.Mail.MailMessage $FromAddress, $ToAddress, $MessageSubject, $MessageBody

###Модуль отправки письма
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SendingServer
$SMTPClient.Send($SMTPMessage)


Скрипт PowerShell для смены пароля у группы пользователей:

###массив, в котором храняться логины пользователей(меняем SMS на название вашей ГРУППЫ из AD)
[array]$u=Get-ADGroupMember sms

###переменная счетчик
[int]$a = 0
###измеряем количество пользователей в группе(это нужно чтобы знать длину цикла)
[int]$b=$u.Length

do{
###Модуль генерации случайного пароля, переменная $len задает длину пароля
[int] $len = 8
[string] $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
$bytes = new-object "System.Byte[]" $len
$rng = new-object System.Security.Cryptography.RNGCryptoServiceProvider
$rng.GetBytes($bytes)
$result = ""
for( $i=0; $i -lt $len; $i++ )
{
$result += $chars[ $bytes[$i] % $chars.Length ]
}
$result

$securestring = ConvertTo-securestring $result -asplaintext -force
$u[$a]=Get-ADUser $u[$a] -properties Mobile
get-aduser $u[$a] | set-adaccountpassword -newpassword $securestring
$MobilePhone = $u[$a].Mobile
###Формируем дату(месяц)
$month= get-date -format MMMM

###Настройки почты
$FromAddress = "Здесь указываем ваш e-mail(Поле от кого)"
### Тут указана почта вашего смс провайдера(например)
$ToAddress = "email@sms.sms-uslugi.com"
###Здесь просто текст, который будет в теме письма, для данного конкретного случая не обязательный, оставлен для универсальности
$MessageSubject = "Ваш новый пароль на $month"
###Здесь составляем ТЕЛО письма согласно инструкции вашего провайдера
$MessageBody = "|логин;пароль;$MobilePhone;имя_отправителя;Новый пароль $result|"
$SendingServer = "здесь имя вашего почтового домена или его ip"

###Модуль создание письма
$SMTPMessage = New-Object System.Net.Mail.MailMessage $FromAddress, $ToAddress, $MessageSubject, $MessageBody

###Модуль отправки письма
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SendingServer
$SMTPClient.Send($SMTPMessage)
$a=$a+1
}
###Задаем условие цикла
while ($a -ne $b)


Важное замечание:
Если вы собираетесь работать с ActiveDirectory через PowerShell на машине с Windows 7 или 8, то Вам нужно будет скачать и установить Remote Server Administration Tools (RSAT) либо для Windows 7, либо для Windows 8. В Windows 7, Вам необходимо будет открыть в Панели управления (Control Panel) раздел Программы (Programs) и выбрать Включить или выключить функции Windows (Turn Windows Features On or Off). Найдите Remote Server Administration Tools и раскройте раздел Role Administration Tools. Выберите подходящие пункты для AD DS and AD LDS Tools, особенно обратите внимание на то, что должен быть выбран пункт Active Directory Module for Windows PowerShell. (Взято от сюда).
Второе, у вас должно быть заполнено поле с мобильным номером телефона у пользователя в формате +7… (Находится в свойствах (Properties) вкладка «Telephones» и соответственно поле «Mobile»).

Скрипт выполнялся в связке Windows 8 и Windows Server 2012, соответственно работал PowerShell 3.0.

Для запуска скрипта через Планировщик(задав все необходимые временные условия) или через ярлык можно использовать вот так
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe здесь относительный или абсолютный путь к скрипту


PS. Изначально, данный вопрос был поднят мной на TechNet тут
Это был мой первый раз, когда я программировал на PowerShell, очень может быть, что код далеко не идеален.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.