使用Get-ADUser按两个属性过滤

时间:2018-07-31 22:53:47

标签: powershell active-directory

Get-ADUser -SearchBase "OU=Purgatory,DC=domain,DC=com" -Filter {'enabled -eq $false' -and 'whenChanged -lt $ChangeDate'}

我不知道如何用两个特征过滤。我想按早于$ ChangeDate变量的禁用用户进行筛选。如果仅按'enabled -eq $false'进行过滤,则有效;如果仅按'whenChanged -lt $ChangeDate'进行过滤,则有效。但是,如果我使用-和将它们结合起来,那就没有运气了。

1 个答案:

答案 0 :(得分:0)

通常,您应该 avoid the use of script blocks ({ ... }) as -Filter arguments

最终,传递给-Filter参数的所有内容都是 string ,并且使用{ ... }只会掩盖这一事实,因为它错误地暗示了封闭的表达式是一段 PowerShell 代码-不是;它是Get-Help about_ActiveDirectory_Filter

中所述的严格受限的PowerShell- 语言

让人困惑的是,AD提供程序恰好会识别它最终接收(并使用)的字符串中的简单变量引用(例如$ChangeDate{ ... }有效地将...作为字符串文字)传递,而任何表达式(例如$ChangeDate.Year)都不是 认可。

  • 通常,最安全的方法是使用 expandable (内插)字符串(双引号; "...")作为-Filter参数,并使用“烘烤”变量价值观也就是说,PowerShell在AD提供程序看到字符串之前,将变量引用替换为其值

  • 但是,目前尚不清楚如何在这样的字符串内表示 date 值,以便如此识别,因此可以利用 在这种情况下,由 AD 提供程序提供的变量解释恰好是最安全的选择(请注意使用引号('...' ),这意味着字符串按原样传递-PowerShell不执行插值):

Get-ADUser -SearchBase "OU=Purgatory,DC=domain,DC=com" `
  -Filter 'enabled -eq $false -and whenChanged -lt $ChangeDate'

同样,请注意,您正在将字符串文字传递给-Filter,并且它是 AD提供程序解释嵌入式变量引用的原因,仅适用于简单变量引用,不适用于表达式


关于您尝试过的事情

通过在其上调用{'enabled -eq $false' -and 'whenChanged -lt $ChangeDate'}方法来有效地传递

.ToString(),该方法按原样传递{}之间的所有内容。

也就是说,cmdlet / AD提供程序可以看到
'enabled -eq $false' -and 'whenChanged -lt $ChangeDate'
作为字符串值,包括单引号,这不是您想要的。