我对powershell知之甚少。

我想知道是否有人可以指出我需要了解的以下内容:

PS C:\Users\username> (Get-Aduser -Filter 'Enabled -eq $true').count
1234
PS C:\Users\username> (Get-Aduser -filter * | where {$_.Enabled -eq $true }).count
13

他们读得很相似...?什么是“已启用”,它与我阅读的$_有何不同,我所指的是“管道上的当前对象”,我假设它是通过“where”进行迭代的。

谢谢!

最佳答案

一般来说-这

Get-Aduser -Filter "something -eq 'some value'"

将过滤器发送到服务器(即域 Controller ),服务器仅返回匹配的用户,而这
Get-Aduser -filter *

从服务器获取所有用户,并在脚本内的第二步中过滤它们(使用where)。

显然,即使结果相同,第一种方法也更加有效。

至于Enabled检查,事情要复杂一些。 AD中的用户对象实际上没有Enabled属性-该属性添加在客户端。这意味着您无法将Enabled -eq $true传递到服务器,它将不知道该怎么做。

AD用户帐户对象的the userAccountControl property收集各种标志:



还有很多。设置标志2时,帐户被禁用。如果使用LDAP过滤器设置了此标志,则可以专门查询服务器:
# all disabled users
Get-ADUser -LdapFilter "(userAccountControl:1.2.840.113556.1.4.803:=2)"

# all NOT disabled users
Get-ADUser -LdapFilter "(!(userAccountControl:1.2.840.113556.1.4.803:=2))"

这有点笨拙,但这是LDAP的方式。 (:1.2.840.113556.1.4.803:表示LDAP中的“按位AND”运算符。他们不知何故没有为其简化符号。)

使用此筛选器,筛选实际上会再次在服务器端进行,这意味着它应该比替代方法快得多,尤其是在AD中有许多用户帐户时。

我不认为有一种方法可以用-Filter的“友好的” Get-ADUser语法表达这一特定的东西,但是其他过滤器可以在服务器端工作
# all users whose first name starts with an A
Get-ADUser -Filter "givenName -like 'A*'"
Get-ADUser在内部执行的操作是,它解析-Filter字符串,并根据该字符串构建LDAP过滤器,因为LDAP过滤器语法是服务器唯一了解的语法:

“PowerShell样式”过滤器givenName -like 'A*'将转换为LDAP过滤器(givenName=A*)

但是当尝试使用Enabled -eq $true时,似乎在Get-ADUser内部出现了问题,似乎完全忽略了它,可能是因为它不够聪明,无法将其转换为(!(userAccountControl:1.2.840.113556.1.4.803:=2))。因此,LDAP过滤器保持为空,服务器返回所有帐户。

这就是为什么我倾向于从一开始就编写LDAP过滤器的原因。它学习起来并不难,比PowerShell语法更通用,比客户端过滤更快,并且可以按原样发送到服务器,没有任何麻烦。

09-10 02:04
查看更多