查询AD中密码即将过期的账户并发邮件通知

2013年6月1日 | 分类: Windows | 标签: , , , ,

        最近要求调整用户账户密码策略,需要用户定期修改密码,需要写一个脚本,查询AD中密码即将过期的用户,并发邮件通知,很久之前就知道VBS有现成的脚本,测试了一下,发现VBS只能查询指定OU和该OU一级子OU中的用户,对于AD中组织结构比较完整的来说,一级子OU中的用户并不是全部,所以只能放弃。

运气比较好,一下就搜到了人家写好的脚本,测试了一下,使用上有三个小问题,作者写的脚本中得到的$daystoexpire值含多个属性,与定义的$expireindays比较时值有问题,导致结果不准确,所以比较时使用了$daystoexpire的一个属性值Days,第二个发送邮件的时候调用的密码过期时间的变量有误,第三个是Powershell的命令Send-Mailmessage无法添加SMTP认证,客户端可能会提示邮件是仿冒的。

原文地址:

http://blogs.technet.com/b/parallel_universe_-_ms_tech_blog/archive/2012/02/14/powershell-scan-ad-find-users-who-s-password-are-close-to-expiring-and-email-them.aspx

修改后的脚本如下,红色部分为修改部分。

##################################################################################################################

# Please Configure the following variables….

$smtpServer=”smtpServerName”

$expireindays = 14

###################################################################################################################

 

#Get Users From AD who are enabled

Import-Module ActiveDirectory

$users = get-aduser -filter * -properties * -searchbase “OU=*,DC=*,DC=*”  |where {$_.Enabled -eq “True”}

 

foreach ($user in $users)

{

 

 if ($user.passwordexpired -eq “True”)

 {

  write-host $user.displayname ” Password Has Already Expired”

 

 }

 elseif ($user.passwordneverexpires -ne “True”)

 {

 

  $passwordSetDate = $user.PasswordLastSet

  $dfl = (get-addomain).DomainMode

 

  if ($dfl -eq “Windows2008Domain”)

  {

   $accountFGPP = Get-ADUserResultantPasswordPolicy $user

 

         if ($accountFGPP -ne $null)

   {

             $maxPasswordAgeTimeSpan = $accountFGPP.MaxPasswordAge

            }

   else

   {

                $maxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge

            }

      }

      else

      {

              $maxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge

         }

 

    if ($maxPasswordAgeTimeSpan -eq $null -or $maxPasswordAgeTimeSpan.TotalMilliseconds -eq 0)

  {

            Write-Host  “MaxPasswordAge is not set for the domain or is set to zero!”

        }

  else

  {

   $today = get-date

   $expireson = $passwordsetdate + $maxpasswordagetimespan

   $daystoexpire = $expireson – $today

   $expireIn = $daystoexpire.Days

   if ($expireIn -lt $expireindays)

   {

     $emailaddress = $null

     $emailaddress = $user.emailaddress

 

     if ($emailaddress -ne $null)

     {

      $subject=”Your password will expire in $expireIn days”

       $body=”Your password will expire in $expireIn days”

       Send-Mailmessage -smtpServer $smtpServer -from support@yourdomain.com -to $emailaddress -subject $subject -body $body -priority High

     }

   }

  }

 

 }

}

Written by an6097

目前还没有任何评论.
注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。