PowerShell查询AD:如何模糊匹配计算机描述中的用户名?
解决Active Directory中筛选包含用户名的计算机描述问题
问题背景
需要筛选AD组及子组中的所有用户名,再找出描述字段包含这些用户名的计算机。当前计算机描述里包含空格、"NEW"等额外字符,现有代码只能完全匹配,无法实现包含匹配:
foreach ($file in Get-ADGroupMember -Identity GroupName -Recursive) {Get-ADComputer -Filter 'Description -like $file.name' -Property Name,Description | Select -Property Name,Description}
尝试添加通配符或改用-Include均未成功,需要修改代码实现包含匹配。
解决方案
问题核心在于两个点:
- 单引号包裹的筛选字符串中,变量
$file.name不会被解析为实际用户名,而是作为字面量处理 - 缺少通配符
*来实现“包含”逻辑
修改后的代码如下:
foreach ($user in Get-ADGroupMember -Identity GroupName -Recursive) { # 构建包含通配符的筛选条件,双引号确保变量正常展开 $filterCondition = "Description -like '*$($user.name)*'" Get-ADComputer -Filter $filterCondition -Property Name,Description | Select-Object Name,Description }
关键修改说明
- 将循环变量名改为
$user,更符合语义(原变量名$file容易造成误解) - 使用双引号包裹筛选条件,让
$user.name被正确解析为当前遍历的用户名 - 在用户名前后添加
*通配符,匹配所有包含该用户名的描述内容 - 用
$($user.name)子表达式语法,确保对象属性在双引号字符串中被正确解析(避免PowerShell误解析为$user变量加.name字符串)
额外提示
如果用户名中包含AD筛选的特殊字符(如*、?),可以用[ADSISearcher]::EscapeFilter($user.name)对用户名进行转义,避免筛选逻辑出错,示例:
foreach ($user in Get-ADGroupMember -Identity GroupName -Recursive) { $escapedUserName = [ADSISearcher]::EscapeFilter($user.name) $filterCondition = "Description -like '*$escapedUserName*'" Get-ADComputer -Filter $filterCondition -Property Name,Description | Select-Object Name,Description }
内容的提问来源于stack exchange,提问作者Lucie
相关产品推荐
相关产品推荐

