PowerShell脚本优化:消除AD用户MemberOf中VPN组重复显示问题
解决PowerShell脚本中VPN组重复显示的问题
优化后的完整脚本
# 仅执行一次AD查询,获取用户所有组信息 $user = Get-ADUser $sam -Properties MemberOf # 统一提取所有组名,避免重复拆分DN $allGroups = $user.MemberOf | ForEach-Object { $_.Split(",")[0].Split("=")[1] } # 显示VPN安全组 Write-Output "`nVPN安全组" Write-Output "-------------------" $vpnGroups = $allGroups | Where-Object { $_ -imatch 'Azure' } $vpnGroups | ForEach-Object { $_ } Write-Output "`n共找到 $($vpnGroups.Count) 个VPN安全组" # 显示排除VPN组后的其他安全组 Write-Output "`n其他安全组" Write-Output "---------------" $otherGroups = $allGroups | Where-Object { $_ -notin $vpnGroups } $otherGroups | ForEach-Object { $_ }
核心优化点
- 减少AD查询:只调用一次
Get-ADUser,避免重复访问Active Directory,提升脚本效率 - 统一组名提取:在第一步就把所有组的DN转换成组名,避免后续重复执行字符串拆分操作
- 消除冗余:用
-notin运算符从所有组中排除已筛选出的VPN组,确保其他组列表无重复内容 - 简化逻辑:拆分VPN组和其他组的逻辑清晰分离,便于后续维护
原问题根源
- 原脚本两次调用
Get-ADUser做重复查询,属于不必要的性能浪费 - 第二部分脚本未对VPN组做过滤,导致已在VPN列表中展示的组再次出现在其他组结果里
内容的提问来源于stack exchange,提问作者kila
相关产品推荐
相关产品推荐

