如何通过Get-ADUser命令按命名规则排除AD域指定用户
AD查询按命名规则排除指定账号实现
需求说明
查询AD活动目录用户时,需要排除符合特定命名规则的账号,待排除账号示例如下:
TST292736ca PRD1212ca PRD212132121ca PRD293873 PRD122 TST141444 TST122 cyberhw12
其余符合同类规则的账号也需要统一排除,具体排除规则:
- 用户名以
TST开头且以ca结尾的账号 - 用户名以
PRD开头且以ca结尾的账号 - 用户名以
cyber开头的账号
现有已编写的基础查询脚本如下,需要在此基础上补充多条件排除逻辑实现精准过滤:
get-aduser -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress |where {$_.Enabled -eq "True"} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false }
实现方案
直接在原有过滤链路末尾追加字符串正则排除条件即可,使用PowerShell原生的-notmatch运算符实现规则匹配,性能优于多段独立字符串判断,修改后的完整脚本:
get-aduser -filter * -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress | where {$_.Enabled -eq $true} | where { $_.PasswordNeverExpires -eq $false } | where { $_.passwordexpired -eq $false } | # 注:默认匹配AD用户登录名SamAccountName,若需匹配显示名称请将$_.SamAccountName替换为$_.Name where { $_.SamAccountName -notmatch '^(TST.*ca|PRD.*ca|cyber)' }
逻辑说明
- 正则规则
^(TST.*ca|PRD.*ca|cyber)中,^代表从字符串起始位置开始匹配,.*匹配任意长度的任意字符,|代表或逻辑,只要用户名命中三条规则中的任意一条就会被过滤 - 该规则不会误杀示例中
PRD293873、PRD122、TST141444、TST122这类前缀符合但结尾不为ca的账号,完全匹配预设的过滤要求 - 条件里的布尔值判断原来写的字符串
"True"可以直接换成PowerShell布尔值$true,执行效率更高,不会出现类型转换异常
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

