powershell檢測AD域用戶密碼到期郵件提醒腳本spring
- $comments = @' author:fuhj(powershell@live.cn ,http://txj.shell.tor.hu)'@
- cls
- #############################################################################
- # Description: The current script send Alert for users before they password
- # expires. You can set some values to configure this script.
- ############################################################################
- ###############################################################################
- # Get The max Password age from AD
- ###############################################################################
- function Get-maxPwdAge{
- $root = [ADSI]"LDAP://mydomain.local"
- $filter = "(&(objectcategory=domainDNS)(distinguishedName=DC=codespring,DC=local))"
- $ds = New-Object system.DirectoryServices.DirectorySearcher($root,$filter)
- $dc = $ds.findone()
- [int64]$mpa = ($dc.Properties[‘maxpwdage’][0]).ToString().Trim("-")
- return $mpa*(.000000100)/86400
- }
- ###############################################################################
- # Function to send email to each user
- ###############################################################################
- function send_email_user ($remaining_day, $email, $name )
- {
- $today = Get-Date
- $date_expire = [DateTime]::Now.AddDays($remaining_day) ;
- $SmtpClient = new-object system.net.mail.smtpClient
- $mailmessage = New-Object system.net.mail.mailmessage
- $SmtpClient.Host = "smtp.mydomain.local"
- $mailmessage.from = "it@mydomain.local"
- $mailmessage.To.add($email)
- $mailmessage.Bcc.add("it-reports@mydomain.local")
- $mailmessage.Subject = 「$name, your password expires on mydomain.local 」
- $mailmessage.IsBodyHtml = $true
- $mailmessage.Body = "<h1>Dear $name </h1>"
- $mailmessage.Body +="<h5> Your password for account <font color=red>$email</font> will be expirend in <font color=red><strong>$remaining_day</strong></font> days on <strong>$date_expire</strong></h5>"
- $mailmessage.Body +="For other question please ask the Administrators !<br /><br />"
- $mailmessage.Body += " Generated on : $today<br /><br />"
- $mailmessage.Body += "================================== <br />"
- $mailmessage.Body += "mydomain.local <br />"
- $smtpclient.Send($mailmessage)
- }
- ###############################################################################
- # Send REPORT for Admins
- ###############################################################################
- function sendmail($body)
- {
- $today = Get-Date
- $SmtpClient = new-object system.net.mail.smtpClient
- $mailmessage = New-Object system.net.mail.mailmessage
- $SmtpClient.Host = "smtp.mydomain.local"
- $mailmessage.from = "it@mydomain.local"
- $mailmessage.To.add("it-reports@mydomain.local")
- $mailmessage.Subject = 「[Report] mydomain.local password expires」
- $mailmessage.IsBodyHtml = $true
- $mailmessage.Body = "<h4>Generated on : $today `n</h4>" + $body
- $mailmessage.Body += "`n" + $body1
- $smtpclient.Send($mailmessage)
- }
- ###############################################################################
- # Search for the active directory users with following conditions
- # 1. Is in USER category
- # 2. Is loged in more that 1 times - for eliminate the system accounts
- # 3. Eliminate the Disbaled Accounts
- ###############################################################################
- $strFilter = "(&(objectCategory=User)(logonCount>=1)(!userAccountControl:1.2.840.113556.1.4.803:=2))"
- $objDomain = New-Object System.DirectoryServices.DirectoryEntry
- $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
- $objSearcher.SearchRoot = $objDomain
- $objSearcher.PageSize = 1000
- $objSearcher.Filter = $strFilter
- $colResults = $objSearcher.FindAll();
- #SET the max day before expiration alert
- $max_alert = 10
- ###############################################################################
- #SET the max password lifetime
- # In the future i rewrite to ask teh GP for the group.
- ###############################################################################
- $max_pwd_life= get-maxPwdAge;
- $userlist = @()
- foreach ($objResult in $colResults)
- {$objItem = $objResult.Properties;
- if ( $objItem.mail.gettype.IsInstance -eq $True)
- {
- $user_name = $objItem.name
- $user_email = $objItem.email
- #Transform the DateTime readable
- $user_logon = [datetime]::FromFileTime($objItem.lastlogon[0])
- $result = $objItem.pwdlastset
- $user_pwd_last_set = [datetime]::FromFileTime($result[0])
- #calculate the difference in Day
- $diff_date = [INT]([DateTime]::Now - $user_pwd_last_set).TotalDays;
- if (($max_pwd_life - $diff_date) -le $max_alert) {
- $selected_user = New-Object psobject
- $selected_user | Add-Member NoteProperty -Name "Name" -Value $objItem.name[0]
- $selected_user | Add-Member NoteProperty -Name "Email" -Value $objItem.mail[0]
- $selected_user | Add-Member NoteProperty -Name "LastLogon" -Value $user_logon
- $selected_user | Add-Member NoteProperty -Name "LastPwdSet" -Value $user_pwd_last_set
- $selected_user | Add-Member NoteProperty -Name "EllapsedDay" -Value $diff_date
- $selected_user | Add-Member NoteProperty -Name "RemainingDay" -Value ($max_pwd_life-$diff_date)
- $userlist+=$selected_user
- }
- }
- }
- ###############################################################################
- # Send email for each user
- ###############################################################################
- foreach ($userItem in $userlist )
- {
- send_email_user $userItem.RemainingDay $userItem.Email $userItem.Name
- }
- ###############################################################################
- # Sedn email for Admins in reporting format
- ###############################################################################
- $bodyme = $userlist| Sort-Object "RemainingDay" | ConvertTo-Html -Title "AD password Status" -Body "<H2>Ad password expiration Status</H2> " -head "<style>td{font-size:smaller;padding:0 0 0 5px;border: 1px solid #003366;}table{border: 1px solid #003366;margin:0;padding:0}tr{margin:0;padding:0;}h2{color:red};th{font-size:smaller;text-align:left;border: 1px solid #003366;background-color:#aaa;}</style>" | foreach {$_ -replace "<table>", "<table cellspacing=0>"}
- sendmail $bodyme
- ###############################################################################
- # END
- ###############################################################################