PowerShell脚本优化:按原CSV行筛选导出禁用AD用户
问题解决:按行筛选CSV中的禁用AD用户
需求明确
处理仅含Permissions列的CSV文件,需满足:
- 仅保留禁用的AD用户
- 排除两类对象:启用的AD用户、以
S-1-5-21-开头的SID标识 - 输出必须与原CSV行严格一一对应:每行符合条件的用户用
;分隔,无符合对象则输出空行
现有脚本问题
- 所有禁用用户被合并为单行输出,未按原CSV行拆分
- 空行数量错误(例如原CSV有3行,其中2行无符合用户时,错误输出4个空行)
输入输出示例
输入CSV(input.csv)
Permissions user1;S-1-5-21-123456;user2 user3 S-1-5-21-789012;user4
期望输出
user1 user4
说明:user1为禁用用户,user2为启用用户被排除;user3为启用用户,输出空行;user4为禁用用户,SID标识被排除
修正后的PowerShell脚本
# 读取输入CSV文件,替换为你的实际文件路径 $inputPath = "input.csv" $outputPath = "output.txt" Import-Csv -Path $inputPath | ForEach-Object { # 拆分当前行的权限项,过滤空值和SID前缀项 $candidates = $_.Permissions -split ';' | Where-Object { $_ -and -not $_.StartsWith('S-1-5-21-') } # 筛选禁用的AD用户,忽略查询失败的对象 $disabledUsers = $candidates | ForEach-Object { try { $adUser = Get-ADUser -Identity $_ -Properties Enabled -ErrorAction Stop if (-not $adUser.Enabled) { $_ } } catch { # 跳过不存在的用户或查询错误 continue } } # 输出当前行的结果:符合条件的用户用;分隔,无则输出空字符串 $disabledUsers -join ';' } | Out-File -Path $outputPath -Encoding UTF8
关键修正点
- 逐行处理:通过
ForEach-Object遍历原CSV的每一行,确保输出与原行一一对应 - 精准过滤:先排除SID前缀项,再查询AD用户状态筛选禁用对象
- 错误处理:用
try/catch捕获AD用户查询失败的情况(如用户不存在),避免脚本中断 - 空行控制:无符合条件用户时,
$disabledUsers -join ';'会输出空字符串,对应正确的空行
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

