Powershell';已启用eq$true';vs其中{$\已启用-eq$true}
我对powershell知之甚少 我想知道是否有人能告诉我需要了解什么来解释以下内容: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 他们读的很相似?什么是“已启用”以及它与我读到的引用“管道上的当前对象”的$有
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*'"