能否在AD上游过滤用户组列表(通配符匹配)以提升效率?
问题:获取AD用户所属匹配指定模式的组并优化查询性能
- 需求:结合
Get-ADUser与Get-ADGroup,筛选出用户所属组中名称匹配指定通配符模式的列表 - 痛点:远程VPN环境下拉取用户全部组速度较慢,希望在AD查询阶段就完成组名过滤,而非先拉取所有组到本地再循环筛选,同时确认该方式是否比后过滤更高效
尝试的代码及问题
第一种尝试代码
$SEC_GROUPS = (Get-ADUser $_ –Properties MemberOf).memberof | Get-ADGroup -filter {Name -like "*SEC*"} -Properties Name,Description | Select-Object Name,Description | Sort-Object name
第二种尝试代码
$SEC_GROUPS = (get-aduser $_ -properties Memberof).memberof | Get-ADGroup -filter 'Name -like "*SEC*"' -Properties Name,Description -ErrorAction SilentlyContinue | select-object Name,Description | Sort-Object Name
问题:第二种写法会错误拉取所有名称匹配
*SEC*的AD组,而非仅当前用户所属的组
解决方法及优化说明
采用以下代码实现需求并优化性能:
$SEC_GROUPS = (get-aduser $_ -properties Memberof).memberof -like '*SEC*' | Get-ADGroup -Properties Name,Description | select-object Name,Description | Sort-Object Name
关键说明
- 性能优化逻辑:先对
Get-ADUser返回的MemberOf属性(组的完整DN,格式为CN=SEC_xxx,OU=Groups,...)做本地通配符过滤,再将符合条件的组DN传给Get-ADGroup查询详情。这种方式大幅减少了VPN环境下的AD远程查询量,本地过滤DN的成本远低于远程拉取大量组信息,性能更优 - 匹配规则注意:由于
MemberOf返回的是组的完整DN而非单纯组名,即使组名以SEC开头,也需要在匹配模式两端加*,才能匹配到CN=SEC_xxx格式的DN内容
内容的提问来源于stack exchange,提问作者Doofus
相关产品推荐
相关产品推荐

