如何列出已禁用且仍属AD组的AD用户,解决导出报告组名显示异常?
解决AD禁用用户导出时MemberOf字段显示类型而非组名的问题
问题原因
memberof属性返回的是AD组的DistinguishedName(DN)集合对象,直接通过Select-Object导出时,PowerShell无法自动将这个对象集合解析为可读的组名称,所以会显示对象类型Microsoft.ActiveDirectory.Management.ADPropertyValueCollection。
解决方法
需要通过计算属性遍历memberof中的每个组DN,调用Get-ADGroup获取对应的组名称,再将名称拼接为字符串后导出。以下是修改后的完整脚本:
$path = "c:\temp\DisabledUsers_ContainGroups ($(Get-Date -Format "yyyy-MM-dd")).xlsx" $date = Get-Date -Format yyyy-MM-dd Get-ADUser -Filter "enabled -eq `$false -and memberof -ne `$null" -Properties memberof | Select-Object Name, SamAccountName, @{ Name = "MemberOfGroups" Expression = { # 遍历每个组DN,获取组名称后用逗号分隔 $_.memberof | ForEach-Object { (Get-ADGroup $_).Name } -join ', ' } } | Export-Excel -Path $path -WorksheetName $date -AutoSize -AutoFilter -TableStyle Medium2
关键修改说明
- Filter优化:将原脚本的脚本块Filter改为字符串格式(AD模块推荐写法),用
memberof -ne $null替代memberof -like '*',逻辑更准确。 - 计算属性处理MemberOf:新增
MemberOfGroups字段,通过ForEach-Object逐个解析组DN为组名称,再用-join ', '拼接成逗号分隔的字符串,导出后Excel中直接显示可读的组名列表。 - 精简Properties参数:
Name和SamAccountName是Get-ADUser的默认返回属性,无需在-Properties中指定。
可选:按组拆分每行显示
如果需要每个用户-组组合单独一行(方便后续按组筛选清理),可以用ExpandProperty展开memberof后再处理:
$path = "c:\temp\DisabledUsers_ContainGroups_Expanded ($(Get-Date -Format "yyyy-MM-dd")).xlsx" $date = Get-Date -Format yyyy-MM-dd Get-ADUser -Filter "enabled -eq `$false -and memberof -ne `$null" -Properties memberof | Select-Object Name, SamAccountName, @{Name='MemberOfGroup'; Expression={$_}} -ExpandProperty memberof | ForEach-Object { $_ | Select-Object Name, SamAccountName, @{Name='GroupName'; Expression={(Get-ADGroup $_.MemberOfGroup).Name}} } | Export-Excel -Path $path -WorksheetName $date -AutoSize -AutoFilter -TableStyle Medium2
内容的提问来源于stack exchange,提问作者ak2595
相关产品推荐
相关产品推荐

