Powershell 使用sAMAccountname从Get ADUser筛选结果

Powershell 使用sAMAccountname从Get ADUser筛选结果,powershell,active-directory,Powershell,Active Directory,我想使用Get ADUser从广告中提取用户名。我遇到的问题是,当使用samaccountname作为过滤器时,如果在多个条目中找到该值,我会得到多个结果。举例来说,如果我的samaccountname是'a123b',而我的同事是'c1234d',我在运行此操作时会得到两个名称: get-aduser -ldapFilter "(samaccountname=*123*)"| select Name 我只想返回基于“123”而不是“1234”的信息 我也尝试过以下方法,但没有效果: get-

我想使用
Get ADUser
从广告中提取用户名。我遇到的问题是,当使用
samaccount
name作为过滤器时,如果在多个条目中找到该值,我会得到多个结果。举例来说,如果我的
samaccountname
是'a123b',而我的同事是'c1234d',我在运行此操作时会得到两个名称:

get-aduser -ldapFilter "(samaccountname=*123*)"| select Name
我只想返回基于“123”而不是“1234”的信息

我也尝试过以下方法,但没有效果:

get-aduser -Filter "samaccountname -like '*123*'" | select Name

您可以使用正则表达式缩小范围:

$filter = "[a-zA-Z]123[a-zA-Z]"
Get-ADUser -Filter "samaccountname -like '*123*'" | where { $_.samaccountname -match $filter} | select name
  • $filter
    是一个简单的正则表达式模式,查找123个字母(大写或小写)
  • -match
    是允许正则表达式比较的运算符
在筛选器或LDAPFilter中使用部分SamAccountName时,很可能会得到多个结果

要测试并返回特定的用户帐户,您需要尽可能使筛选器更加具体(取决于您的环境对AccountName使用的策略),如

或者使用一个额外的
Where Object
子句,通过其他一些用户属性(如firstname)缩小结果范围,例如:

Get-ADUser -Filter "SamAccountName -like '*123*'" | Where-Object { $_.GivenName -eq 'John' } | Select-Object Name
请注意,上面的示例仍然可以返回多个用户对象

如果有,检索单个用户对象的绝对可靠方法是使用该用户的
DistinghuishedName
,并使用
-Identity
参数获取对象。看

附言:
当使用
-like
运算符或LDAPFilter时,在名称中可能变化的部分使用通配符。

由于在LDAP查询中不能使用正则表达式,因此可以使用类似这样的查询来告诉它查找包含
123
但不包含第四位数字的用户帐户:

(&(objectClass=user)(samaccountname=*123*)(!samaccountname=*1231*)(!samaccountname=*1232*)(!samaccountname=*1233*)(!samaccountname=*1234*)(!samaccountname=*1235*)(!samaccountname=*1236*)(!samaccountname=*1237*)(!samaccountname=*1238*)(!samaccountname=*1239*)(!samaccountname=*1230*))
虽然很难看,但它很管用


请注意,如果您有一个以通配符开头的筛选器,则无法使用该属性的索引,因此它必须查看每个帐户才能找到匹配项。我为
objectClass
添加了一个过滤器,因为它是索引的,它将确保它只查看用户对象。

谢谢您的建议。不幸的是,我不能使用任何其他过滤器,因为我严格使用SamAccountName来查找用户信息。我看到了您试图实现的目标,我相信这也会起作用。然而,伊奇顿提供的解决方案更适合我们的需要。但我感谢你调查我的问题!没问题。请记住,另一个解决方案将要求AD提供比您需要的更多的帐户,将它们全部加载到内存中,然后丢弃部分结果。而这个解决方案只会要求你需要什么。如果你过滤掉的账户很少,那就没关系了。但是如果你过滤我们的10个或100个账户,那么在速度上会有更大的差异。明白了,我甚至没有想到过滤更多账户时会对性能造成潜在的影响。目前,我的脚本在范围上非常有限,因此其他解决方案可以工作。但为了将来的参考,我将研究你的解决方案作为一个可行的替代方案。再次感谢!
(&(objectClass=user)(samaccountname=*123*)(!samaccountname=*1231*)(!samaccountname=*1232*)(!samaccountname=*1233*)(!samaccountname=*1234*)(!samaccountname=*1235*)(!samaccountname=*1236*)(!samaccountname=*1237*)(!samaccountname=*1238*)(!samaccountname=*1239*)(!samaccountname=*1230*))