PowerShell:AD帳號快速檢查
這一篇程式原始版本是從黑暗執行序大大那裏得到的。必須先感謝他。
原文連結如下:
https://blog.darkthread.net/blog/ad-account-status-quick-check/
我這邊因為公司需要做了一些改良如下,也許會有更好的方式歡迎提出意見。
有些程式碼我註解幾來保留了原來得寫法方便大家可以使用。
- 改為採用Email方式做查詢。不須輸入子網域名稱,改為IF迴圈進入查詢。因為我們公司有四個子網域,最常常會查的我放在第一層,剩下的按照可能的常用順序。
移除(註解)了強制參數的方式,改為程式中輸入Email。- 檢查Email如果不是公司Email則不做查詢。
- 因為有時候需要連續查詢,所以做出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帳號,會是網路速度稍微慢一點,多個一兩秒應該都還在可以接受的範圍。
備註:
- 你的電腦必須是加入網域。
- 無需使用系統管理員權限。
- Powershell必須已經安裝AD 模組。