0

ADパスワードの有効期限についてユーザーに自動的に通知するためのスクリプトがあります。VPNユーザーに必要でした。しかし、$msg.toフィールドの問題を解決する方法が見つかりません。たとえば、「$ msg.to =''」を受け入れることはできず、$msg.to.addメソッドでのみ機能します。最初に通知されたユーザーが次のすべての電子メールを受信するのは、文字列の最後に追加されるだけで、$ msg.toのすべてのデータが置き換えられるわけではないため、あまり良い状況ではありません。

コードがあります:

Import-Module ActiveDirectory

#SMTP server name
$smtpServer = "mail.domain.local"

#Creating a Mail object
$msg = new-object Net.Mail.MailMessage
$msgr = new-object Net.Mail.MailMessage

#Creating SMTP server object
$smtp = new-object Net.Mail.SmtpClient($smtpServer)


#E-mail structure
Function EmailStructure($to,$expiryDate,$upn)
{
    $msg.IsBodyHtml = $true
    $msg.From = "notification@domain.com"
    $msg.To.Add($to)
    $msg.Subject = "Password expiration notice"
    $msg.Body = "<html><body><font face='Arial'>This is an automatically generated message from Exchange service.<br><br><b>Please note that the password for your account <i><u>Domain\$upn</u></i> will expire on $expiryDate.</b><br><br>Please change your password immediately or at least before this date as you will be unable to access the service without contacting your administrator.</font></body></html>"
}

Function EmailStructureReport($to)
{
    $msgr.IsBodyHtml = $true
    $msgr.From = "notification@domain.com"
    $msgr.To.Add($to)
    $msgr.Subject = "Script running report"
    $msgr.Body = "<html><body><font face='Arial'><pre><b>This is a daily report.<br><br>Script has successfully completed its work.<br>$NotificationCounter users have recieved notifications:<br><br>$ListOfAccounts<br><br></b></pre></font></body></html>"
}

#Set the target OU that will be searched for user accounts
$OU = "OU=Organisation,DC=domain,DC=local"

$ADAccounts = Get-ADUser -LDAPFilter "(objectClass=user)" -searchbase $OU -properties PasswordExpired, extensionAttribute15, PasswordNeverExpires, PasswordLastSet, Mail, Enabled | Where-object {$_.Enabled -eq $true -and $_.PasswordNeverExpires -eq $false}
$NotificationCounter = 0
$ListOfAccounts = ""

Foreach ($ADAccount in $ADAccounts)
{
 $accountFGPP = Get-ADUserResultantPasswordPolicy $ADAccount

                if ($accountFGPP -ne $null)
        {
                 $maxPasswordAgeTimeSpan = $accountFGPP.MaxPasswordAge
        }
        else
        {
                 $maxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge
                }

#Fill in the user variables
    $samAccountName = $ADAccount.samAccountName
    $userEmailAddress = $ADAccount.ExtensionAttribute15
    $userPrincipalName = $ADAccount.UserPrincipalName

    if ($ADAccount.PasswordExpired)
    {
     Write-host "The password for account $samAccountName has expired!"
    }
    else
    {
     $ExpiryDate = $ADAccount.PasswordLastSet + $maxPasswordAgeTimeSpan
     $TodaysDate = Get-Date
     $DaysToExpire = $ExpiryDate - $TodaysDate
     $DaysToExpireDD = $DaysToExpire.ToString() -Split ("\S{17}$")
     Write-host "The password for account $samAccountName expires on: $ExpiryDate. Days left: $DaysToExpireDD"
        if (($DaysToExpire.Days -eq 15) -or ($DaysToExpire.Days -eq 7) -or ($DaysToExpire.Days -le 3))
        {
         $expiryDate = $expiryDate.ToString("d",$ci)
#Generate e-mail structure and send message
            if ($userEmailAddress)
            {
             EmailStructure $userEmailAddress $expiryDate $samAccountName
             $smtp.Send($msg)
             Write-Host "NOTIFICATION - $samAccountName :: e-mail was sent to $userEmailAddress"
             $NotificationCounter = $NotificationCounter + 1
             $ListOfAccounts = $ListOfAccounts + $samAccountName + "&#9; - $DaysToExpireDD days left.<br>"
            }
        }

    }
}
Write-Host "SENDING REPORT TO IT DEPARTMENT"
EmailStructureReport("itdepartment@domain.com")
$smtp.Send($msgr)

電子メールを送信するたびに$msg.toに文字列をドロップするにはどうすればよいですか?

4

1 に答える 1

3

同じメッセージを再利用したいが、アドレスを変更して別のアドレスに複数回送信する場合は、MailAddressCollectionのclearメソッドを使用します。

したがって、コードは次のようになります。

$msg.To.Clear()
$msg.To.Add($to)
于 2012-11-21T13:57:42.160 に答える