lygyh9985825 发表于 2018-9-1 12:47:45

powershell实现域用户密码到期邮件提醒功能

  最近要实现域用户密码到期后,自动发邮件提醒的功能。感觉用powershell实现起来比较方便。
  查到的资料大多都是AD和Exchange安装在一起,不实用。
  下面的代码是整合了网上的资料,实际可以运行的代码。
  主要参考了:http://www.nibayuan.com/2014/12/31/task-ad-password-expires-email/
  http://blog.csdn.net/andrewniu/article/details/52594318
  说明:

[*]  服务器为windows server 2012 r2 std 中文版
[*]  此服务器只是DC,无其它功能。
  Import-Module Activedirectory
  $alladuser=get-aduser -searchbase "ou=xxx,dc=xxxxx,dc=xxxx" -filter *| %{$_.Samaccountname}
  #上面的“ou=***,dc=***,dc=***” 根据自己域结构实际情况填写
  $userlist = @()
  echo $alladuser#显示所有用户
  #echo $userlist
  $itmag = "xxxxx@xxxxxx.com" #IT管理员的邮件地址
  function sendmail($mailaddr,$body) #定义发送邮件的方法
  {
  $msg=New-Object System.Net.Mail.MailMessage
  $msg.To.Add($mailaddr)
  #$msg.Bcc.Add($itmag)#抄送给管理员
  $msg.From = New-Object System.Net.Mail.MailAddress("xxxxx@xxxxxx.com", "xxxx",::GetEncoding("UTF-8"))   #发件人
  $msg.Subject = "邮件密码即将过期提醒"
  $msg.SubjectEncoding = ::GetEncoding("UTF-8")
  $msg.Body =$body
  #$Attachments=New-Object System.Net.Mail.Attachment("D:\Documents\xxxx.zip")#创建附件
  #$msg.Attachments.add($Attachments) #添加附件,英文名可多个,中文名就只能带一个。
  $msg.BodyEncoding = ::GetEncoding("UTF-8")
  $msg.IsBodyHtml = $false#发送html格式邮件
  #$msg.Priority = ::High
  $client = New-Object System.Net.Mail.SmtpClient("smtp.xxxxxxx.cn")#配置smtp服务器
  $client.Port = 587#指定smtp端口
  $client.EnableSsl = $true #带ssl功能的smtp服务器
  $client.UseDefaultCredentials = $false
  $client.Credentials=New-Object System.Net.NetworkCredential("xxxx@xxx.com", "*********")
  try {$client.Send($msg)}
  catch
  {$($_.Exception.Message)
  $mailaddr
  }
  }
  foreach ($user in $alladuser)
  {
  #密码最后一次更改时间
  $pwdlastset=Get-ADUser $user -Properties * | %{$_.passwordlastset}
  #密码的过期时间
  $pwdlastday=$pwdlastset.AddDays(90)
  #当前时间
  $now=get-date
  #判断账户是否设置了永不过期
  $neverexpire=get-aduser $user -Properties * |%{$_.PasswordNeverExpires}
  #距离密码过期的时间
  $expire_days=($pwdlastday - $now).Days
  #判断过期时间天小于5天大于-5天(即已过期5天)的并且没有设置密码永不过期的账户
  if($expire_days -lt 5 -and $expire_days -gt -5 -and $neverexpire -like "false" )
  {
  $chineseusername= Get-ADUser $user-Properties * | %{$_.Displayname}
  #邮件正文
  $Emailbody=
  "Dear $chineseusername :
  您的邮箱密码即将在 $expire_days 天后过期,请您尽快更改。
  更改密码请遵循以下原则:
  ○密码长度最少 8 位;
  ○密码可使用最长时间 90天,过期需要更改密码;
  ○密码最短使用 1天( 1 天之内不能再次修改密码);
  ○强制密码历史 3个(不能使用之前最近使用的 3 个密码);
  ○密码符合复杂性需求(大写字母、小写字母、数字和符号四种中必须有三种、且密码口令中不得包括全部或部分用户名)
  "
  $tomailaddr = $user + "@xxxx.com"
  #echo $tomailaddr
  sendmail $tomailaddr $Emailbody
  }
  }

niskl1 发表于 2018-12-11 15:39:19

很棒,很实用的
页: [1]
查看完整版本: powershell实现域用户密码到期邮件提醒功能