PowerShell 技能连载 - 尽可能使用服务端过滤
当您跨网络获取信息时,请注意只能在最后一步使用客户端技术,例如 Where-Object
。服务端过滤技术更有效率。
例如,当您试图根据电子邮箱查找用户时,客户端的 Where-Object
语句将会将所有 AD 用户推到您的计算机上,并且通过本地的 Where-Object
来确认您需要的用户:
#requires -Version 1 -Modules ActiveDirectory
# inefficient client-side filter
Get-ADUser -Filter * | Where-Object { $_.mail -ne $null }
如您猜想的那样,当一个 cmdlet 有一个名为 -Filter
的参数时,它可以在传送数据到您的机器之前,在服务端过滤需要的元素。然而,Get-ADUser
命令的 -Filter
参数有的时候工作起来很困难,需要将类似 PowerShell 的语法转换为 Active Directory 所需的 LDAP 查询。
所以更常见的是,在第一处使用 LDAP 查询字符串更自然。这两条语句将会快速地找出所有包含(和不包含)邮箱地址的用户账户:
#requires -Version 1 -Modules ActiveDirectory
# any user with a mail address
Get-ADUser -LDAPFilter '(mail=*)'
# any user with NO mail address
Get-ADUser -LDAPFilter '(!mail=*)'
PowerShell 技能连载 - 尽可能使用服务端过滤
http://blog.vichamp.com/2015/11/06/use-server-side-filtering-when-possible/