Powershell';已启用eq$true';vs其中{$\已启用-eq$true}

Powershell';已启用eq$true';vs其中{$\已启用-eq$true},powershell,Powershell,我对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 他们读的很相似?什么是“已启用”以及它与我读到的引用“管道上的当前对象”的$有

我对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
他们读的很相似?什么是“已启用”以及它与我读到的引用“管道上的当前对象”的
$有何不同

谢谢

一般来说,这

Get-Aduser -Filter "something -eq 'some value'"
将筛选器发送到服务器(即域控制器),服务器仅返回匹配的用户,而

Get-Aduser -filter *
从服务器获取所有用户,并在脚本的第二步中对其进行筛选(使用
where

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


至于启用的
检查,事情有点复杂。AD中的用户对象实际上没有启用的
属性-该属性添加到客户端。这意味着您无法将
Enabled-eq$true
传递给服务器,服务器将不知道如何处理它

AD用户帐户对象具有收集各种标志的功能:

这有点笨拙,但LDAP就是这样做的。(
:1.2.840.113556.1.4.803:
表示LDAP中的“按位AND”运算符。不知何故,他们没有为其制作更简单的符号。)

有了这个过滤器,过滤实际上再次发生在服务器端,这意味着它应该比备选方案快得多,特别是当AD中有许多用户帐户时

我不认为有一种方法可以用
Get ADUser
的“友好的”
-Filter
语法来表达这个特殊的东西,但是其他的过滤器可以在服务器端工作

# all users whose first name starts with an A
Get-ADUser -Filter "givenName -like 'A*'"

Get ADUser
在内部所做的是,它解析
-Filter
字符串,并从中构建LDAP筛选器,因为LDAP筛选器语法是服务器唯一理解的:

“PowerShell样式”筛选器
givenName-如“A*”
将被转换为LDAP筛选器
(givenName=A*)

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


这就是我从一开始就倾向于编写LDAP过滤器的原因。它不太难学,比PowerShell语法更通用,比客户端过滤更快,并且按原样发送到服务器,事先没有任何问题。

两个查询将产生相同的结果,第二个查询将比第一个查询花费更长的时间。$\u是根据您的条件筛选检索到的用户的单个迭代
.Enabled
正如您已经知道的,这是用户对象的属性。请注意,如果数据集太大,您可能会遇到异常,尽管结果不同,正如您在上面所看到的?我们的广告中一定有一些奇怪的东西-我问题中的逐字查询生成的数字与您在同一台机器上的同一powershell窗口中看到的数字相同。请在powershell中尝试此操作
$true-eq“ANYTHING”=true
@Jawad不相关,因为它假定传递给
-Filter
的字符串是PowerShell代码,由PowerShell规则以任何方式计算。事实并非如此
Get ADUser
在内部解析该字符串,将其转换为LDAP筛选器字符串,并将其发送到服务器。PowerShell使用相同代码所做的操作在这里不适用。我已经与我们的广告进行了检查,
Get Aduser-Filter'Enabled-eq$true'
只返回所有帐户。我已经在我答案的扩展部分解释了原因。如果
Get ADUser
抛出一个错误(“无法解释筛选器字符串”或类似的内容),则会更好,但它不会。这只是需要注意的众多PowerShell怪癖之一。很抱歉我迟到了,但您的答案已在中提到。根据我测试的注释-Filter
“Enabled-eq$true”
,它运行良好。我得到了与
Where
相同的结果。然后我做了
-Filter*
,得到了更多的结果。我将结果分组,以确认启用与禁用的差异。针对2k8、12和19 DCs的豪华5.1 2k8 FFL单独测试。让我知道你的想法。
# 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))"
# all users whose first name starts with an A
Get-ADUser -Filter "givenName -like 'A*'"