我对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语法更通用,比客户端过滤更快,并且可以按原样发送到服务器,没有任何麻烦。