Я создаю сценарий, который проверяет учетные записи пользователей с скоро истекающими паролями и отправляет электронные письма этим людям, напоминая им об изменении их паролей. Да, наши настройки домена уже генерируют эти запросы с обратным отсчетом от 14 дней. Да, люди игнорируют это. Да, я пытаюсь сохранить работу из-за того, что люди не могут своевременно изменить свои пароли при работе удаленно.
В скрипте I go через массив подразделений, за которые я отвечаю и получить учетные записи пользователей с паролями, срок действия которых истекает, и сохранить их в массиве, содержащем их DisplayName, Mail и вычисленные значения, содержащие DaysLeft и ExpiryDate:
$diff = New-TimeSpan -Start ([datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")) -End (Get-Date)
$OusToSearch = @(
'OU=ORG1,DC=corp,DC=com'
'OU=ORG2,DC=corp,DC=com'
'OU=ORG3,DC=corp,DC=com'
)
ForEach ($OU in $OusToSearch) {
$PwdExpUsersInOU = Get-ADUser -SearchBase $OU -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False -and Mail -like '*'} -Properties "DisplayName", "mail", "msDS-UserPasswordExpiryTimeComputed" | Where-Object {
$diff = New-TimeSpan -End ([datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")) -Start (Get-Date)
$diff.Days -le 14 -and $diff.Days -ge 0
} | Select-Object "DisplayName","Mail",@{Name="DaysLeft";Expression={$diff.Days}},@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}
$PwdExpUsers += $PwdExpUsersInOU
}
Спасибо многим, кто задавал вопросы и отвечал здесь код.
Эта часть работает. На данный момент у меня есть массив $PwdExpUsers
, содержащий соответствующую информацию.
Далее я разбиваю этот массив на несколько меньших массивов, чтобы отправить настроенную электронную почту, адресованную каждому человеку, на который возвращается запрос с сообщениями, соответствующими тому, как скоро истекает срок действия их паролей:
Примечание 1: В настоящее время он тестирует код, фильтрует и создает электронные письма только для тех, чьи пароли истекают завтра, как должно быть видно из приведенного ниже кода. Как только я выясню проблему адресации, я расширю ее, чтобы обработать остальную часть массива.
Примечание 2: содержимое сообщения HTML Я уже храню в переменных ($ MsgT завтра) ранее в скрипте. Это работает нормально.
$Outlook = New-Object -ComObject Outlook.Application
$ExpTomorrow = $PwdExpUsers | Where-Object -FilterScript {$PSItem.DaysLeft -eq '0'}
foreach ($Account in $ExpTomorrow) {
$Mail = $Outlook.CreateItem(0)
$Mail.Importance = 2
$Mail.To = $PSItem.Mail
$Mail.Subject = "IMPORTANT: Your computer login password expires tomorrow"
$Mail.HTMLBody = $MsgTomorrow
$Mail.Save()
}
В конце этого у меня есть электронные письма в папке «Черновики» с правильной темой и телом, но без адреса электронной почты в поле «Кому».
Я предполагаю, что мне не удается gr asp, как передается значение $PSItem.Mail
и что $Mail.To
ожидает получить.
Действительное решение также полностью удалит бит ForEach
и позволит мне создать единый адрес электронной почты для всех членов массива $ExpTomorrow
.