отправить письмо со всем результатом в одном письме - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь получить все результаты в одном письме вместо отправки почты каждый раз

это то, что у меня есть сейчас, и оно отправляет почту каждому пользователю с истекшим сроком действия пароля или около.

Помощь будет высоко ценится

Спасибо

$MaxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge

Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} -properties PasswordLastSet,
                                                                                    PasswordExpired,
                                                                                    PasswordNeverExpires,
                                                                                    EmailAddress,
                                                                                    DisplayName,
                                                                                    GivenName,
                                                                                    SN,
                                                                                    pwdLastSet | 
foreach {
    $UserName = $_.DisplayName
    $SN = $_.SN
    $Email = $_.EmailAddress
    $today = Get-Date
    $enc  = New-Object System.Text.utf8encoding
    $ExpiryDate = $_.PasswordLastSet + $maxPasswordAgeTimeSpan
    $DaysLeft = ($ExpiryDate-$today).days
    $Msg1 = "<p style='font-family:arial'>Hi,</p>
            <p style='font-family:arial'>Password for the $UserName is expired.</p>
            <p style='font-family:arial'>Thanks.</p>"

    $Msg2 = "<p style='font-family:arial'>Hi,</p>
            <p style='font-family:arial'>The password for $UserName will  expire $ExpiryDate.</p>
            <p style='font-family:arial'>Thanks.</p>"

    If ($_.PasswordExpired -like 'True') {
        Send-mailmessage -to "xxx@xxx.com"` 
        -from x@x.com`
        -Subject "Mot de passe Windows"`
        -body $WarnMsg1 -smtpserver x.x.x.x `
        -BodyAsHtml -Encoding $enc
    }

    ElseIf ($DaysLeft -eq 1) {
        Send-mailmessage -to "x@x.com"`
        -from x@x.com `
        -Subject "Mot de passe Windows"`
        -body $WarnMsg2 -smtpserver x.x.x.x `
        -BodyAsHtml -Encoding $enc
    }
}

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

А как насчет этого? Я не смог проверить это, но я исправил несколько ошибок в вашем первом коде

  • Фильтр на Get-ADUser был неправильным (не используйте там фигурные скобки)
  • Нет атрибута PasswordExpired, вам нужно вычислить дату
  • Удалены некоторые ненужные атрибуты
  • Сплит sendMailMessage для удобства чтения

$maxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.Days

$mailBody = ""
$date = Get-Date

$adUsers = Get-ADUser -Filter 'Enabled -eq $true -and PasswordNeverExpires -eq $false' `
    -Properties PasswordLastSet, DisplayName | 
        Where-Object { $_.PasswordLastSet }

foreach ($adUser in $adUsers) {
    $expirationDate = $adUser.PasswordLastSet.AddDays($maxPasswordAge)
    $daysUntilExpiration = ($expirationDate - $date).Days
    if ($daysUntilExpiration -gt 0 -and $daysUntilExpiration -lt 7) {
        $mailBody += "Password of $($adUser.DisplayName) is about to expire in $daysUntilExpiration"
    }
    elseif ($daysUntilExpiration -le 0) {
        $mailBody += "Password of $($adUser.DisplayName) is expired"
    }
}

$sendMailMessage = @{
    To         = ""
    From       = ""
    Subject    = ""
    Body       = $mailBody
    SmtpServer = "smtp.office365.com"
    Port       = 587
    Encoding   = UTF8
}

Send-MailMessage @sendMailMessage -BodyAsHtml -UseSSL
0 голосов
/ 28 августа 2018

Вы можете создать объект PSObject, содержащий пользователей в цикле foreach, а затем использовать этот список для отправки одного электронного письма, заполненного объектами PSO.

Примечание: я не проверял это, так как в данный момент у меня нет доступа к среде AD, но она должна быть довольно близко ...

$MaxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge
$Properties = @("PasswordLastSet","PasswordExpired","DisplayName")

$PasswordExpired = @()
$OneDayLeft = @()

$SMTPServer = "x.x.x.x"
$today = Get-Date

Get-ADUser -Filter "Enabled -eq $True -and PasswordNeverExpires -eq $False" -Properties $Properties | foreach {

    $DisplayName = $_.DisplayName
    $ExpiryDate = $_.PasswordLastSet + $maxPasswordAgeTimeSpan
    $DaysLeft = ($ExpiryDate-$today).days

    If ($_.PasswordExpired -like 'True') {
        #Add user to PasswordExpired PSObject if password expired:
        $PasswordExpired += New-Object -TypeName PSObject -Property @{User="$DisplayName"}
    }
    ElseIf ($DaysLeft -eq 1) {
        #Add user to OneDayLeft PSObject if password expiring soon:
        $OneDayLeft += New-Object -TypeName PSObject -Property @{User="$DisplayName"; ExpiryDate="$ExpiryDate"}
    }
}

#Use PSObject to create a HTML Table:
$PasswordExpired_Table = $PasswordExpired | ConvertTo-Html -Fragment
$OneDayLeft_Table = $OneDayLeft | ConvertTo-Html -Fragment

#Assemble Email Body string using HTML Table of data:
$PasswordExpired_Body = "<p style='font-family:arial'>Hi,</p>
        <p style='font-family:arial'>Expired passwords:</p>
        <p style='font-family:arial'>$PasswordExpired_Table</p>
        <p style='font-family:arial'>Thanks.</p>"

$OneDayLeft_Body = "<p style='font-family:arial'>Hi,</p>
        <p style='font-family:arial'>Passwords expiring soon:</p>
        <p style='font-family:arial'>$OneDayLeftTable</p>
        <p style='font-family:arial'>Thanks.</p>"

Send-MailMessage -to "xxx@xxx.com" -from "x@x.com" -Subject "Mot de passe Windows" -body $PasswordExpired_Body -smtpserver $SMTPServer -BodyAsHtml -Encoding UTF8
Send-MailMessage -to "x@x.com" -from "x@x.com" -Subject "Mot de passe Windows va expirer demain" -body $OneDayLeft_Body -smtpserver $SMTPServer -BodyAsHtml -Encoding UTF8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...