场景

定期查询AD中的用户,过滤出所有被锁定的账号,生成一个表格,并发送给IT同学。

实现

  • 直接上脚本
## 查询所有锁定用户的SamAccountName
$account_locked  =  (Search-ADAccount -LockedOut -SearchBase "ou=employees,dc=123,dc=com" -ResultSetSize 1000).SamAccountName 

##
$Report = @() ## 定一个空数组

Foreach ($i in $account_locked){
     $userinfo = Get-ADUser -id $i -Properties Name,SamAccountName,DisplayName,mail,LastLogonDate
     $displayname = $userinfo.DisplayName
     $email = $userinfo.mail
     $samaccount = $i
     $lastlogondate = $userinfo.LastLogonDate
## 自定义个PS对象遍历存储所有用户信息
     $Report += New-Object -TypeName psobject -Property @{
        SamAccountName = $samaccount
        DisplayName = $displayname
        Email = $email
        LastLogonDate = $lastlogondate
      }
}

$Report = $Report | Sort-Object  LastLogonDate

## 定义一个数据表
$DataTable = New-Object System.Data.DataTable "DataTable"
$col1 = New-Object system.Data.DataColumn LogonName,([string])
$col2 = New-Object system.Data.DataColumn DisplayName,([string])
$col3 = New-Object system.Data.DataColumn Email,([string])
$col4 = New-Object system.Data.DataColumn LastLogonDate,([string])

## 增加列
$DataTable.Columns.Add($col1)
$DataTable.Columns.Add($col2)
$DataTable.Columns.Add($col3)
$DataTable.Columns.Add($col4)

## 增加数据行
foreach ($entry in $Report){
    $row = $DataTable.NewRow()
    $row.LogonName = $entry.SamAccountName
    $row.DisplayName = $entry.DisplayName
    $row.Email = $entry.Email
    $row.LastLogonDate = $entry.LastLogonDate
    $DataTable.Rows.Add($row)

}

#Write-Output $DataTable.Rows

## 构造html表头

$HtmlTable = "<table border='1' align='Left' cellpadding='2' cellspacing='0' style='color:black;font-family:arial,helvetica,sans-serif;text-align:left;'>
<tr style ='font-size:12px;font-weight: normal;background: #FFFFFF'>
<th align=left><b>登录名</b></th>
<th align=left><b>显示名</b></th>
<th align=left><b>邮箱</b></th>
<th align=left><b>后登陆日期</b></th>
</tr>"

## 构造html表体
foreach ($row in $DataTable)
{
    $HtmlTable += "<tr style='font-size:12px;background-color:#FFFFFF'>
    <td>" + $row.LogonName + "</td>
    <td>" + $row.DisplayName + "</td>
    <td>" + $row.Email + "</td>
    <td>" + $row.LastLogonDate + "</td>
    </tr>"

}
## 表尾
$HtmlTable += "</table>"
#Write-Output $HtmlTable

Function SendEmail  {
     $From = "shi.zhenning@hello.com"
     $To = "shi.zhenning@hellog.com"
     $Subject = "账号锁定通知" 
     $Body = $HtmlTable
     $smtpServer = "mail.hello.com"
     $smtpPort = 587
     $username = "username"
     $password = "password"

     $SMTPMessage = New-Object System.Net.Mail.MailMessage($From, $To, $Subject, $Body)
     $SMTPMessage.IsBodyHTML=$true
     $SMTPClient = New-Object Net.Mail.SmtpClient($smtpServer, $SmtpPort) 
     $SMTPClient.EnableSsl = $true 
     $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($username, $password); 
     $SMTPClient.Send($SMTPMessage)
    }

 SendEmail
    
  • 看下效果 image.png