Поздравления сотрудников с днём рождения по средством скрипта для Active Directory

Проблема: Необходимо по заданному атрибуту в AD отправить сообщение с напоминанием дня рождения сотрудника

Решение: Смотрим в OU атрибут extensionattribute10 видим заполненные поля. Берем с заданного поля первые 4 цифры сравниваем их с текущей датой и месяцем. Если условия совпадают отправляем сообщения по заданным атрибутам всем сообщения о дне рождения сотрудника. В данной статье рассмотрен пример отправки сообщения о дне рождения в текущий день.

Для изменения напоминания дня рождения, правим - (вместа (0) ставим день за который нужно напомнить о дней рождении.

$NextDay = (get-date).AddDays(0).ToString("dd.MM")
$NextDayFormat = (get-date).AddDays(0).ToString("dd.MM.yyyy")
  • Запускаем скрипт из PowerShell
# Фильтр по типу объекта и по OU
$UserFilter = "(objectCategory=User)"
$ObjSearch = New-Object System.DirectoryServices.DirectorySearcher
$ObjSearch.PageSize = 10000
$ObjSearch.Filter = $UserFilter
$ObjSearch.SearchRoot = "LDAP://ou=Contoso,dc=com"

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

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

# Параметры для отправки почты

$EmailFrom = "Birthday@contoso.com"
$SmtpServer = "mail.contoso.com"
$EmailTo="test@contoso.com"
$Msg = New-Object Net.Mail.MailMessage
$Encoding = [System.Text.Encoding ]::UTF8

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

$Pass = Get-Content C:\Scripts\Temppassex.txt | ConvertTo-SecureString
$Cred = New-Object System.Management.Automation.PsCredential ("birthday@contoso.com", $Pass)

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

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

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

# Получаем эту дату из 10-го атрибута
# В нашем случае это атрибут в AD с именем - extensionattribute10 куда мы вбили дату рождения сотрудника
[string] $DayOfBirth = $UserInf.extensionattribute10 

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

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

# Формируем сообщение в формате HTML
$Msg.IsBodyHtml = $true
$Msg.Subject = "Сегодня День Рождения у сотрудника " + $UserInf. displayname
$Msg.Body = "
<style>
h1 {
        color: #FFA500;
}
h2 {
        color: #A52A2A;
}
</style>
<center><h1><b>Поздравляем с Днём Рождения!</h1></b></center>
<center><h2><i>" + $UserInf.displayname + "</i></h2></center>

" 

send-MailMessage -SmtpServer $SmtpServer -To $EmailTo -From $EmailFrom -Credential $Cred -Subject $Msg.Subject -Body $Msg.Body -BodyAsHtml -Encoding $Encoding -Priority High
}
}
}

В ранней версии - скрипт имел серьезные ошибки.

Статья дополнена и исправлена - 30.08.2018.

Теперь скрипт работает =) Можно запускать в Планировщик.

P.S. Данный скрипт полностью рабочий и используется в рабочей среде.