Unlock-ADAccountコマンドレット
試験環境のドメイン管理権限を持ってると「パスワード間違えてロックかけちゃったよ~」とHELP要請をもらうことがそれなりにある。はず。
ドメインがいくつもあったりすると、対応の内容は簡単だけどちょっとめんどくかったり。
Powershellでのロック解除はUnlock-ADAccount
コマンドレットを使う。
DOSコマンドのnet user
に/domain /active:yes
オプションを付けても解除可能だけど、ユーザ名をちゃんと指定してあげないといけないし、実行ユーザはあまり融通効かない。
以下のコマンドなら、実行ユーザの権限が及ぶ範囲で、ロックアウト中の全ユーザのロックを解除できる。(なんて暴力的!)
Search-ADAccount -LockedOut | Unlock-ADAccount
Script
…とはいえ、実運用ではさすがに問い合わせがきたアカウントだけ解除したいし、かつ自分も普段は権限が低いユーザを使ってたりする場合もあるのでスクリプトにする。
ドメイン名を名前解決できれば、実行端末と解除したいユーザが別ドメインでもいけるはず。
# ユーザアンロックスクリプト
# Usage: .\Unlock-User.ps1 -User testuser01 -Domain test1domain
Param($User = $null, $Domain = $null)
# 入力チェック
if ($User -eq $null){
echo "Usage:.\Unlock-User.ps1 -User testuser01 -Domain test1domain"
exit 2
}
if ($Domain -eq $null){
$Domain = $env:USERDOMAIN
}
# Credential作成 "AdminUser"=Adminのユーザ名
$secUser = $Domain + "\AdminUser"
$objCred = Get-Credential -UserName $secUser -Message "Domain Admins"
# ユーザチェック
$objUser = Get-ADUser -Filter 'Name -like $User' -Server $Domain -Credential $objCred
if ($objUser -eq $null){
echo "ユーザ検索失敗"
exit 2
}
$objUser = Search-ADAccount -LockedOut -Server $Domain -Credential $objCred | Where {$_.Name -eq $User}
if ($objUser -eq $null){
echo "${domain}\${user}はロック解除済"
exit 1
}
# ロックアウト解除
$objUser | Unlock-ADAccount -Credential $objCred
$objUser = Search-ADAccount -LockedOut -Server $Domain -Credential $objCred | Where {$_.Name -eq $User}
if ($objUser -eq $null){
echo "${domain}\${user}のパスワードロックを解除"
exit 0
}else{
echo "${domain}\${user}のパスワードロック解除に失敗"
exit 2
}
実行するとGet-Credential
でAdminユーザのパスワード入力が求められます。
それも面倒なときは、パスワードベタ書きで。
# Credential作成 "AdminUser"=Adminのユーザ名
$secUser = $Domain + "\AdminUser"
$strPass = "password"
$secPass = ConvertTo-SecureString $strPass -AsPlainText -Force
$objCred = New-Object System.Management.Automation.PSCredential($secUser, $secPass)
雑感
ActiveDirectory周りは、現場が変わると常識も違うので面白いね。
個人的には、ADが主題じゃないような試験環境とかではパスワードロックポリシーなんて外しておいた方がいいと思ってるけど、ガチガチセキュリティでエンドユーザクライアント管理が第一目標の本番環境の設計思想なら気軽にロック解除出来てるようじゃまずい。