Напоминалка о днях рождениях сотрудников в домене

В компаниях часто встречается задача уведомлять сотрудников о приближающихся днях рождения их коллег. Где-то этим занимается секритариат, а где-то какие-либо системы (корпоративный сайт, SharePoint и т.п.). В этой статье я расскажу о простеньком скрипте на PowerShell, который работает с AD и рассылает уведомления по почте.
Итак сценарий работы скрипта такой:
1) Берем из AD всех пользователей;
2) У каждого пользователя смотрим Extended attributes 10, в котором записана дата рождения сотрудника в формате дд.мм.гггг;
3) Если дата следующего дня совпадает с датой в Extended attributes 10 сотрудника, делаем рассылку с напоминанием о предстоящем дне рождении этого сотрудника.

Дальше сам скрипт с комментариями:

#фильр по типу объекта и по OU
$UserFilter = "(objectCategory=User)"
$ObjSearch = New-Object System.DirectoryServices.DirectorySearcher
$ObjSearch.PageSize = 10000
$ObjSearch.Filter = $UserFilter
$ObjSearch.SearchRoot = "LDAP://OU=Users,dc=corp,dc=ru"

#колекция всех пользователей в OU
$AllUser = $ObjSearch. FindAll()

#Получаем завтрашний день в формате строки день.месяц и день.месяц.год
$NextDay = (get-date) .AddDays(5 ).ToString( "dd.MM")
$NextDayFormat = (get-date) .AddDays(5 ).ToString( "dd.MM.yyyy")

#Параметры для отправки почты
$EmailFrom = "notice@corp.ru"
$SmtpServer = "10.0.1.25"
$EmailTo="all@corp.ru"
$Msg = New-Object Net.Mail.MailMessage
$Encoding = [System.Text.Encoding ]::UTF8

#Авторизация для сервера Exchange
#При первом запуске скрипта сохраним в текстовый файл зашифрованный пароль от пользователя, под которым будем авторизовываться на почтовом сервере
$GetCred = Get-Credential
$GetCred.Password | ConvertFrom-SecureString | Set-Content C:\Temp\passex.txt
#После первого запуска две строки сверху можно закомментить

$Pass = Get-Content C:\Temp\passex.txt | ConvertTo-SecureString
$Cred = New-Object System.Management.Automation.PsCredential ("notice@corp.ru", $Pass)
#$User = "notice@corp.ru"
#$Pass = ConvertTo-SecureString "password" -AsPlainText -Force
#$Cred = New-Object System.Management.Automation.PSCredential ($User, $Pass)

#Перебор всех элементов колекции
foreach ($User in $AllUser) {

#Получаем все атрибуты пользователя
$UserInf = $User. GetDirectoryEntry()

#Если extensionattribute10 не пустой, т.е. там есть какая-то дата
if ($UserInf .extensionattribute10 -ne "") {

#Получаем эту дату из 10ого аттрибута
[string] $DayOfBirth = $UserInf .extensionattribute10

#Берем из строки первые пять символов (пример 01.10)
$DayOfBirth = $DayOfBirth. substring(0, 5)

#Если дата из аттрибута 10 = дате завтрашнего дня
if ($DayOfBirth -eq $NextDay) {

#Формируем сообщение в формате HTML
$Msg.IsBodyHtml = $true
$Msg.Subject = "Напоминание: $NextDayFormat г. день рождения у сотрудника " + $UserInf. displayname
$Msg.Body = "<p align=center><font color=red>ДЕНЬ РОЖДЕНИЯ!</font> <br><br>
Завтра ( $NextDayFormat г.), " + $UserInf .displayname + " празднует день рождения!</p>"
send-MailMessage -SmtpServer $SmtpServer -To $EmailTo -From $EmailFrom -Credential $Cred -Subject $Msg.Subject -Body $Msg .Body -BodyAsHtml -Encoding $Encoding
}
}
}

Конечно код скрипта не оптимальный, но зато понятный!

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *