PowerShell脚本导出AD禁用用户组信息仅显示单条数据的解决求助
问题分析与解决方案:导出AD禁用用户组信息时CSV仅保留最后一条记录
问题根源
你遇到的CSV文件只保留最后一个用户数据的问题,本质是每次循环调用Export-Csv时,默认会覆盖已有文件内容。原脚本里的Export-Csv没有添加-Append参数,导致每处理一个用户就会替换掉之前的内容,最终只留下最后一条记录。
修改后的完整脚本
我们需要调整导出逻辑,添加-Append参数,同时还可以优化AD查询的效率(减少重复请求):
Import-Module ActiveDirectory # 提前获取所有非Domain Users的组,避免循环内重复查询AD $nonDomainUserGroups = Get-ADGroup -Filter {name -notlike "*domain users*"} # 初始化CSV文件(确保表头只写入一次) $csvPath = "C:\Users\Administrator\Desktop\grpsss.csv" [PSCustomObject]@{ samaccountname = "" givenname = "" surname = "" Groups = "" } | Export-Csv -Path $csvPath -Delimiter ";" -NoTypeInformation # 一次性获取目标OU中所有禁用用户的完整属性 $users = Get-ADUser -Filter 'enabled -eq $false' -SearchBase "OU=Lockdown,DC=home,DC=ac,DC=uk" -Properties samaccountname, memberof, givenname, surname foreach ($user in $users) { # 获取用户所属的非Domain Users组名称 $groupNames = (Get-ADPrincipalGroupMembership -Identity $user.SamAccountName | Where-Object { $_.Name -notlike "*domain users*" } | Select-Object -ExpandProperty Name) -join ',' # 将组信息写入用户的info属性 Set-ADUser $user.samaccountname -Replace @{info="Was a member of :- $groupNames"} # 追加用户信息到CSV文件 [PSCustomObject]@{ samaccountname = $user.samaccountname givenname = $user.givenname surname = $user.surname Groups = $groupNames } | Export-Csv -Path $csvPath -Delimiter ";" -Append -NoTypeInformation # 从非Domain Users组中移除当前用户 Remove-ADGroupMember -Identity $nonDomainUserGroups -Members $user.samaccountname -Confirm:$False } $total = $users.Count Write-Host "$total accounts have been processed..." -ForegroundColor Green
关键修改点说明
- 添加
-Append参数:在Export-Csv中使用该参数,确保每次循环的用户数据是追加到CSV末尾,而不是覆盖原有内容。 - 提前查询组列表:把
Get-ADGroup移到循环外,避免每次处理用户都重复查询AD,大幅提升脚本运行效率。 - 合并AD用户查询:一次性获取用户的
givenname、surname等属性,减少重复调用Get-ADUser的次数。 - 初始化CSV表头:提前写入空对象生成表头,避免多次追加时重复生成表头(若不初始化,第一次
Export-Csv也会自动生成表头,后续-Append不会重复写入,提前初始化更稳妥)。
额外注意事项
- 确保运行脚本的账号拥有足够的AD权限(修改用户属性、移除组成员、读取AD数据)。
- 建议先选取少量测试用户验证脚本行为,确认符合预期后再批量运行。
内容的提问来源于stack exchange,提问作者metho
相关产品推荐
相关产品推荐

