PowerShell AD审计脚本如何实现每行单个用户对应所属安全组
PowerShell AD组审计脚本格式调整方案
你的需求可直接实现,原脚本输出不符合SQL导入要求的核心原因是使用-join运算符将同组所有成员拼接成了单条逗号分隔的字符串,只需调整遍历逻辑,为每个组-成员对应关系单独生成输出行即可。
修正后可直接使用的脚本
Get-ADgroup -Filter 'Name -like "Security Group -*"' -SearchBase "OU=Groups,DC=ADAccess,DC=local" -Properties Members | Sort-Object -Property Name | ForEach-Object { $currentGroupName = $_.Name foreach ($memberDistinguishedName in $_.Members) { [PSCustomObject]@{ name = $currentGroupName Members = (Get-ADObject -Identity $memberDistinguishedName).Name } } } | Export-Csv -Path C:\AuditScript\Audit.csv -NoTypeInformation -Encoding UTF8
核心修改点
- 删除了原脚本中将成员列表拼接为单字符串的
-join ","逻辑 - 遍历每个安全组时,先缓存当前组名称,再逐个遍历组内成员的可分辨名称,每匹配到一个成员就生成一条独立的结构化记录
- 导出CSV时新增
-Encoding UTF8参数,避免存在中文名称时导入SQL出现乱码 - 最终输出的CSV每行对应一组安全组+单个成员的映射关系,和你给出的理想格式完全一致,可直接导入SQL表用于后续审计报告生成。
适配大环境的优化版本
如果域内存在已删除但未从组内清理的残留成员条目,可以加异常捕获避免脚本意外中断,同时标记异常条目方便后续排查:
Get-ADgroup -Filter 'Name -like "Security Group -*"' -SearchBase "OU=Groups,DC=ADAccess,DC=local" -Properties Members | Sort-Object -Property Name | ForEach-Object { $currentGroupName = $_.Name foreach ($memberDistinguishedName in $_.Members) { try { [PSCustomObject]@{ name = $currentGroupName Members = (Get-ADObject -Identity $memberDistinguishedName -ErrorAction Stop).Name } } catch { [PSCustomObject]@{ name = $currentGroupName Members = "异常残留成员: $memberDistinguishedName" } } } } | Export-Csv -Path C:\AuditScript\Audit.csv -NoTypeInformation -Encoding UTF8
内容的提问来源于stack exchange,提问作者hairyson
相关产品推荐
相关产品推荐

