PowerShell 批量禁用AD賬號並記錄
阿新 • • 發佈:2018-12-16
因原始版本包含AD組織資訊,以下為刪改版本,僅做個人備忘
- 較好判斷禁用賬號是否重名,避免禁錯使用者
- 記錄對使用者操作的日誌,刪除組,移動OU,修改備註等
Write-Host @"
#
# name.csv 存放要禁用的賬戶 中文名
#
# log.txt 詳細記錄了針對使用者執行的每一個執行操作(改Description, 刪除每一個組, 移動等等)
#
# 請認真閱讀黃色警告,對其中忽略處理的使用者,進行手動處理
#
"@
pause
# 除錯過程設定該引數不實際執行,只提示
# 要使用,請設定註釋掉該行並新增一行
# $needWhatIf = "-WhatIf"
$needWhatIf = ""
# 每執行一個操作都提示確認
# 要取消,請設定註釋掉該行並新增一行
# $needConfirm = ""
$needConfirm = "-Confirm"
$suffix = "{0} {1}" -f $needWhatIf, $needConfirm
$baseDN = "DC=test,DC=com"
$resigningOU = "OU=yourResigningOU,DC=test,DC=com"
# $cmd 傳入要執行的命令字串
# 執行命令並記錄命令日誌和錯誤日誌
function logAndExe($cmd) {
$cmd | Tee-Object log.txt -Append
Invoke-Expression $cmd
if( -not $?){
$Error[0] | Tee-Object log.txt -Append
}
}
# $sam 傳入使用者的SamAccountName
# 搜尋使用者所屬的組,並剔除掉‘Domain Users’
# 返回 組 的字串列表 [group1, group2, .....]
function search_user_group($sam){
$groups = Get-ADPrincipalGroupMembership -Identity $sam
$group_list = New-Object System.Collections.ArrayList
foreach($g in $groups){
if($g.name -ne 'Domain Users'){
$group_list.Add($g) | Out-Null
}
}
return $group_list
}
# 開始執行主邏輯
Start-Process -Wait notepad -ArgumentList .\name.csv
$userList = Import-Csv 'name.csv' -Encoding Default
$samList = New-Object System.Collections.ArrayList
$d = Get-Date
"`r`n$d:開始匯入使用者:`r`n" | Tee-Object -Append "log.txt" | Write-Host
foreach($u in $userList){
# $block_str = "(Name -eq '{0}') -and (Mobile -eq '{1}')" -f $u.Name, $u.Mobile
$u.Name = $u.Name.TrimEnd()
# 使用者可能有重名字尾,完全限定加上’+‘,比如張三,張三01,則張三+完全限定
if($u.Name.EndsWith("+")){
$u.Name = $u.Name.TrimEnd("+")
$block_str = "Name -eq ""{0}""" -f $u.Name
}
else{
$block_str = "Name -like ""{0}*""" -f $u.Name
}
$block = [scriptblock]::Create($block_str)
$tmp = Get-ADUser -Filter $block -SearchBase $baseDN
if($tmp -eq $null){
"在""$baseDN""下找不到使用者: $($u.Name) ,因此忽略,請確認" | Tee-Object -Append "log.txt" | Write-Warning
continue
}
# 如果使用者姓名有類似,進一步篩選
# 如: 張三
# 張三01將會給出警告,張三三不會給出警告
# 假定 給出的是 張三01, 不會搜尋到重複
elseif($tmp.GetType().Name -eq "Object[]"){
$tmp2 = $tmp | Where-Object {($_.Name -eq $u.Name ) -or $_.Name.Contains($u.Name+“0”)}
if($tmp2.GetType().Name -eq "Object[]"){
# 兩個以上才會是Object[], 結果至少有一個,因為 $_.Name -eq $u.Name
"該使用者賬號: $($u.Name) 存在重名,因此忽略,請確認後填寫完整名,如:張三01!`r`n如果使用者為張三,而還有其他使用者張三01等,完全限定張三請填寫 ""張三+""" | Tee-Object -Append "log.txt" | Write-Warning
"-----------------------------" | Tee-Object -Append "log.txt" | Write-Warning
foreach($t in $tmp2){
$t.Name | Tee-Object -Append "log.txt" | Write-Warning
}
"-----------------------------" | Tee-Object -Append "log.txt" | Write-Warning
# 警告後,跳過新增,繼續處理下一個使用者
continue
}
else{
# 篩選後只有一個,則繼續加入到待處理列表
if($tmp2.Name -ne $u.Name){
"在""$baseDN""下找到使用者: {0} 與name.csv中的使用者: {1} 不完全匹配,,因此忽略" -f $tmp2.Name, $u.Name | Tee-Object -Append "log.txt" | Write-Warning
continue
}
$tmp = $tmp2
}
}
elseif($tmp.Name -ne $u.Name){
"在""$baseDN""下找不到使用者: $($u.Name) ,因此忽略,請確認" | Tee-Object -Append "log.txt" | Write-Warning
continue
}
$samList.Add($tmp) | Out-Null
}
# 對列表中使用者執行移動,剔除組,改名操作
foreach($u in $samList){
$d = Get-Date
"$d:開始處理使用者:$($u.Name)`r`n" | Tee-Object -Append "log.txt" | Write-Warning
# 如果不同部門人員離職需要放到不同OU,可增加函式detect_ou判斷
# $ou = detect_ou($u.DistinguishedName)
# 根據上面函式查詢OU,沒找到目標OU將不予處理,並記錄下日誌
$ou = $resigningOU
if($ou -ne $false){
# 步驟1: 先改使用者描述
$_desc = Get-ADUser -Identity $u.SamAccountName -Properties Description
$desc = $_desc.Description
$cmd = @"
Set-ADUser -Identity {0} -Description {1} {2}
"@ -f $u.SamAccountName, ("`"Disabled {0} {1}`"" -f $d.ToString("yyyy/M/dd"), $desc), $suffix
logAndExe($cmd)
# 步驟2: 剔除使用者所屬的組
foreach($g in search_user_group($u.SamAccountName)){
$cmd = @"
Remove-ADGroupMember -Identity "{0}" -Members "{1}" {2}
"@ -f $g, $u.SamAccountName, $suffix
logAndExe($cmd)
}
# 步驟3: 禁用該使用者
$cmd = @"
Disable-ADAccount -Identity {0} {1}
"@ -f $u.SamAccountName, $suffix
logAndExe($cmd)
# 步驟4: 移動該使用者到對應的OU
$cmd = @"
Move-ADObject -Identity "{0}" -TargetPath "{1}" {2}
"@ -f $u.DistinguishedName, $ou, $suffix
logAndExe($cmd)
}
}
Pause