1. 程式人生 > >PowerShell 批量禁用AD賬號並記錄

PowerShell 批量禁用AD賬號並記錄

因原始版本包含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