PowerShell AD账号自动启停脚本如何避免封禁指定用户组成员
实现方案
核心逻辑:提前定义免封禁用户组,每次处理禁用操作前先校验当前用户是否属于该组,只有不属于且到达禁用日期才执行禁用操作。
关键修改说明
- 提前定义免封禁组变量,后续调整免封禁规则直接修改该值即可
- 调用
Get-ADPrincipalGroupMembership时传入当前用户的$SamAccountName作为参数,获取用户所属的所有组 - 禁用的判断逻辑调整为:禁用日期匹配当前日期 AND 用户不属于免封禁组
修正后完整代码
# 定义免封禁用户组,有多个免封禁组直接往数组里加名称即可 $nonBlockGroups = @("PLKAT-NON-BLOCK-USERS") $currentDate = (Get-Date).ToString('M/d/yyyy') Import-Csv "I:\Clients\Block Accounts\Accounts Deactivation.csv" | ForEach-Object { $SamAccountName = $_.SamAccountName $dateDisable = $_.dateDisable $dateEnable = $_.dateEnable # 先校验用户是否存在,避免CSV填错用户名导致脚本报错 $adUser = Get-ADUser -Filter {SamAccountName -eq $SamAccountName} -ErrorAction SilentlyContinue if (-not $adUser) { Write-Host "用户 $SamAccountName 不存在,跳过处理" return } # 禁用逻辑校验 if ($dateDisable -eq $currentDate) { # 获取用户所有所属组的名称 $userGroups = Get-ADPrincipalGroupMembership -Identity $SamAccountName | Select-Object -ExpandProperty Name # 判断是否属于免封禁组 $isNonBlock = $nonBlockGroups | Where-Object {$_ -in $userGroups} if (-not $isNonBlock) { Disable-ADAccount -Identity $adUser Write-Host "-用户 $SamAccountName 已禁用" } else { Write-Host "-用户 $SamAccountName 属于免封禁组,跳过禁用操作" } } # 启用逻辑不受免封禁组限制,正常执行 if ($dateEnable -eq $currentDate) { Enable-ADAccount -Identity $adUser Write-Host "-用户 $SamAccountName 已启用" } }
额外优化说明
- 新增用户存在性校验,避免错误输入导致脚本中断
- 操作日志覆盖了免封禁跳过的场景,方便运营人员回溯操作
- 如果存在嵌套组需求(比如用户所属的子组属于免封禁组),可以把组成员查询逻辑替换为递归查询即可,当前写法适配绝大多数普通场景
内容的提问来源于stack exchange,提问作者sebas24
相关产品推荐
相关产品推荐

