PowerShell отправлять почту на адрес в массиве - PullRequest
0 голосов
/ 31 марта 2020

Я создаю сценарий, который проверяет учетные записи пользователей с скоро истекающими паролями и отправляет электронные письма этим людям, напоминая им об изменении их паролей. Да, наши настройки домена уже генерируют эти запросы с обратным отсчетом от 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.

1 Ответ

1 голос
/ 31 марта 2020

$PSItem -aka $_ ... Это переменная для значения, которое проходит по трубопроводу.

Попробуйте $Mail.To = $Account.Mail

Если это не так сделайте это, пожалуйста, опубликуйте пример содержимого $ ExpT Saturday

───────

Вы также можете попробовать это без перспективы.

#
$smtp = "mail.server.com"
$from = "123abc@xyz.com"
$subject = "Email Subject Example - Password expiring!"

foreach($Account in $ExpTomorrow){
    # All HTML will go into the body.
    $body = "You are bad at maintaining your passwords, please do it now." 
    $to = $Account.Mail

    # Now send the email using Send-MailMessage 
    send-MailMessage -SmtpServer $smtp -To $to -From $from -Subject $subject -Body $body -BodyAsHtml -Priority high
}
...