如何用PowerShell的Get-ADComputer筛选Windows 7及以上版本计算机
优化Active Directory Windows 7+计算机筛选命令
先帮你梳理下现有命令的可优化点,再给出更简洁高效的解决方案:
- 多个分散的
Where-Object可以合并成一个,提升代码可读性 - 操作系统匹配的正则语法有误(
-match里的*是正则量词,不是通配符,多余了) - 可以扩展匹配范围到Windows 11(毕竟你要的是7及以上版本)
- 更高效的方式是用LDAP筛选器让AD服务器提前过滤数据,减少本地处理压力
方案1:优化后的本地筛选版本
把所有条件合并到一个Where-Object中,修正正则匹配逻辑:
$computers = Get-ADComputer -Properties OperatingSystem | Where-Object { # 匹配Windows 7/8/10/11系统 $_.OperatingSystem -match 'Windows (7|8|10|11)' -and # 名称必须包含连字符 $_.Name -like "*-*" -and # 排除指定前缀/后缀的计算机名称 $_.Name -notlike "V7-*" -and $_.Name -notlike "*-NONE" -and $_.Name -notlike "*-ONCALL" -and $_.Name -notlike "*-BLACKBAUD" }
方案2:更高效的LDAP筛选版本(推荐)
利用Get-ADComputer的-LDAPFilter参数,让AD服务器直接返回符合条件的计算机,大幅减少网络传输和本地处理的开销:
# 构建LDAP筛选规则,所有条件在AD服务器端生效 $ldapFilter = @" (& (| (operatingSystem=Windows 7*) (operatingSystem=Windows 8*) (operatingSystem=Windows 10*) (operatingSystem=Windows 11*) ) (name=*-*) (!(name=V7-*)) (!(name=*-NONE)) (!(name=*-ONCALL)) (!(name=*-BLACKBAUD)) ) "@ $computers = Get-ADComputer -Properties OperatingSystem -LDAPFilter $ldapFilter
额外说明
- 如果你的环境需要包含Windows Server系统(比如Server 2008 R2及以上,基于Windows 7内核),可以在LDAP筛选的操作系统条件里添加
(operatingSystem=Windows Server 2008 R2*)、(operatingSystem=Windows Server 2012*)等对应条目 - 大环境下LDAP筛选的性能优势非常明显,避免了先拉取全量计算机再本地过滤的冗余操作
内容的提问来源于stack exchange,提问作者Our Man in Bananas




