如何修改PowerShell AD用户查询脚本以添加用户组及经理信息?
修改后的PowerShell脚本
Get-ADUser -Filter {Enabled -eq $TRUE} -Properties PasswordLastSet, PasswordNeverExpires, LastLogonDate, Manager, MemberOf | Select-Object Name, PasswordLastSet, PasswordNeverExpires, LastLogonDate, DistinguishedName, @{Name='ManagerName'; Expression={if ($_.Manager) { (Get-ADUser $_.Manager).Name } else { '无' }}}, @{Name='MemberOfGroups'; Expression={($_.MemberOf | ForEach-Object { (Get-ADGroup $_).Name }) -join ';'}} | Export-Csv -Path 'C:\Temp\passlastset_enabledusers.csv' -NoTypeInformation
关键修改说明
- 新增需获取的AD属性:在
Get-ADUser的-Properties参数里加入Manager和MemberOf——这两个属性不属于AD用户默认返回的集合,必须显式声明才能调取。 - 转换经理信息为可读格式:通过自定义计算属性
ManagerName,把Manager字段存储的LDAP路径转换为直观的经理姓名,同时处理空值场景,避免输出无效内容。 - 转换所属组为可读名称:用自定义属性
MemberOfGroups将MemberOf中的组LDAP路径批量转为组名称,再用分号拼接成字符串,方便在CSV中查看完整组列表。 - 优化CSV输出:添加
-NoTypeInformation参数,消除CSV文件开头的冗余类型信息行,让输出更整洁。
大域环境性能优化方案
如果域内用户数量较多,逐个调用Get-ADUser和Get-ADGroup会拖慢执行速度,可提前批量缓存用户和组的映射关系:
# 预缓存所有AD用户的DN与姓名映射 $userCache = @{} Get-ADUser -Filter * -Properties Name | ForEach-Object { $userCache[$_.DistinguishedName] = $_.Name } # 预缓存所有AD组的DN与名称映射 $groupCache = @{} Get-ADGroup -Filter * -Properties Name | ForEach-Object { $groupCache[$_.DistinguishedName] = $_.Name } # 执行用户查询并从缓存取值 Get-ADUser -Filter {Enabled -eq $TRUE} -Properties PasswordLastSet, PasswordNeverExpires, LastLogonDate, Manager, MemberOf | Select-Object Name, PasswordLastSet, PasswordNeverExpires, LastLogonDate, DistinguishedName, @{Name='ManagerName'; Expression={$userCache[$_.Manager] ?? '无'}}, @{Name='MemberOfGroups'; Expression={($_.MemberOf | ForEach-Object { $groupCache[$_] }) -join ';'}} | Export-Csv -Path 'C:\Temp\passlastset_enabledusers.csv' -NoTypeInformation
这种方式仅需两次批量查询,后续直接从缓存字典取值,能大幅提升大域环境下的执行效率。
内容的提问来源于stack exchange,提问作者R V
相关产品推荐
相关产品推荐

