PowerShell:AD帳號快速檢查

這一篇程式原始版本是從黑暗執行序大大那裏得到的。必須先感謝他。
原文連結如下:
https://blog.darkthread.net/blog/ad-account-status-quick-check/

我這邊因為公司需要做了一些改良如下,也許會有更好的方式歡迎提出意見。
有些程式碼我註解幾來保留了原來得寫法方便大家可以使用。

  1. 改為採用Email方式做查詢。不須輸入子網域名稱,改為IF迴圈進入查詢。因為我們公司有四個子網域,最常常會查的我放在第一層,剩下的按照可能的常用順序。
  2. 移除(註解)了強制參數的方式,改為程式中輸入Email。
  3. 檢查Email如果不是公司Email則不做查詢。
  4. 因為有時候需要連續查詢,所以做出While迴圈方便連續查尋因應公司AD欄位屬性,新增一些想看到的資料欄位

下面為程式碼,歡迎自由取用修改:

#Param
#(
#    [Parameter(Mandatory=$True)]
#    [String]$UserEmail
#)
While ($True)
{
    Write-Host "*** AD 帳號問題快篩 Email Version***" -ForegroundColor Yellow
    $UserEmail = Read-Host "Please enter email :::"
    $ErrorActionPreference = "STOP"
    $match = [System.Text.RegularExpressions.Regex]::Match($UserEmail, "[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@xyz.com")
    #$match = [System.Text.RegularExpressions.Regex]::Match($UserEmail, "[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")
    if (!$match.Success) {
        Write-Host "請輸入 正確的Email格式"
        #Exit
    }
    Else
    {
        Write-Host "以下是" $UserEmail "相關資訊"
    }

    [string]$Srvabc = (Get-ADDomainController -Discover -Domain "abc-dc.dhl.com").HostName
    $User = Get-ADUser -Filter {EmailAddress -eq $UserEmail} -Properties LockedOut,LastLogonDate,PasswordLastSet,PasswordNeverExpires,msDS-UserPasswordExpiryTimeComputed,extensionAttribute1,department,co,dhlbusinessunit,displayName -Server $srvabc
    If($User -eq $null)
    {
        #Clear-Variable -Name $User
        [string]$Srvdef = (Get-ADDomainController -Discover -Domain "def-dc.dhl.com").HostName
        $User = Get-ADUser -Filter {EmailAddress -eq $UserEmail} -Properties LockedOut,LastLogonDate,PasswordLastSet,PasswordNeverExpires,msDS-UserPasswordExpiryTimeComputed,extensionAttribute1,department,co,dhlbusinessunit,displayName -Server $srvdef
        If($User -eq $null)
        {
            #Clear-Variable -Name $User
            [string]$Srvghi = (Get-ADDomainController -Discover -Domain "ghi-dc.dhl.com").HostName
            $User = Get-ADUser -Filter {EmailAddress -eq $UserEmail} -Properties LockedOut,LastLogonDate,PasswordLastSet,PasswordNeverExpires,msDS-UserPasswordExpiryTimeComputed,extensionAttribute1,department,co,dhlbusinessunit,displayName -Server $srvghi 
            If($User -eq $null)
            {
                [string]$Srvjkl = (Get-ADDomainController -Discover -Domain "jkl-dc.dhl.com").HostName
                $User = Get-ADUser -Filter {EmailAddress -eq $UserEmail} -Properties LockedOut,LastLogonDate,PasswordLastSet,PasswordNeverExpires,msDS-UserPasswordExpiryTimeComputed,extensionAttribute1,department,co,dhlbusinessunit,displayName -Server $srvjkl
                IF($User -eq $null)
                {
                    Write-Host "找不到使用者 - $UserEmail"
                }
            }

        }
    }

    function Print([string]$label, [string]$value, $pass = $null) 
    {
        Write-Host "$($label): " -ForegroundColor Cyan -NoNewline
        $color = [ConsoleColor]::White
        if ($null -ne $pass) 
        {
            if ($pass -eq $true) { $color = [System.ConsoleColor]::Green }
            else { $color = [ConsoleColor]::Red }
        }
        Write-Host $value -ForegroundColor $color
    }

    function ToYN([bool]$bool) 
    {
        if ($bool) 
        {
            return "是"
        }
        return "否"
    }
    Print "登入帳號" $user.SamAccountName
    Print "登入網域" $user.extensionAttribute1
    Print "隸屬國家" $User.co
    Print "隸屬事業" $User.dhlbusinessunit
    Print "隸屬部門" $user.department
    Print "顯示名稱" $user.DisplayName
    #Print "帳號名稱" "$($user.Name) / $($user.GivenName)"
    Print "上次登入" $user.LastLogonDate.ToString("yyyy-MM-dd HH:mm:ss")
    Print "是否啟用" (ToYN $user.Enabled) -pass ($user.Enabled)
    Print "是否鎖定" (ToYN $user.LockedOut) -pass (!$user.LockedOut)
    [DateTime]$lastPwdSet = $user.PasswordLastSet 
    Print "上次密碼修改" $lastPwdSet.ToString("yyyy-MM-dd HH:mm:ss")
    if (!$user.PasswordNeverExpires) 
    {
        [DateTime]$nextChgDate = [DateTime]::FromFileTime($user."msDS-UserPasswordExpiryTimeComputed")
        [timespan]$timeLeft = $nextChgDate - [DateTime]::Now

        Print "密碼到期日" $nextChgDate.ToString("yyyy-MM-dd HH:mm:ss") -pass ($timeLeft.TotalSeconds -gt 0)
        Write-Host "密碼到期提示: " -NoNewline -ForegroundColor Cyan
        if ($timeLeft.TotalSeconds -lt 0) 
        {
            Write-Host "密碼己於 $($nextChgDate.ToString("yyyy-MM-dd HH:mm:ss")) 到期]" -ForegroundColor Red
        }
        else {
            $color = [ConsoleColor]::Yellow
            [int]$daysLeft = $timeLeft.TotalDays
            if ($daysLeft -le 7) { $color = [ConsoleColor]::Magenta }
            Write-Host "密碼還有 $($daysLeft) 天到期" -ForegroundColor $color
        }
    }
    else 
    {
        Write-Host "** 密碼永久有效 **" -ForegroundColor Magenta
    }
      $choices = Read-Host "Preee enter to again or Type zzz to exit."
      Clear-Variable UserEmail
      if ( $choices -eq "zzz" ) {
        break
      }
}

因為我們有四個子網域,網域主機分散在全球四個地方,所以離開自己所屬的網域要去查AD帳號,會是網路速度稍微慢一點,多個一兩秒應該都還在可以接受的範圍。

備註:

  1. 你的電腦必須是加入網域。
  2. 無需使用系統管理員權限。
  3. Powershell必須已經安裝AD 模組。