【问题标题】:Filter by two properties with Get-ADUser使用 Get-ADUser 按两个属性过滤
【发布时间】:2018-08-03 05:06:55
【问题描述】:
Get-ADUser -SearchBase "OU=Purgatory,DC=domain,DC=com" -Filter {'enabled -eq $false' -and 'whenChanged -lt $ChangeDate'}

我不知道如何按两个特征进行过滤。我想按早于 $ChangeDate 变量的禁用用户进行过滤。如果我只按'enabled -eq $false' 过滤,它可以工作,如果我只按'whenChanged -lt $ChangeDate' 过滤,它就可以工作。但是如果我使用 -and 来组合它们,那就没有运气了。

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    一般情况下,您应该avoid the use of script blocks ({ ... }) as -Filter arguments

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

    中描述的一种受严格限制的类似 PowerShell 的语言

    让事情变得混乱的是,AD 提供者碰巧在它最终收到的字符串中识别出简单的变量引用(例如,$ChangeDate(以及 @ 的使用) 987654329@ 有效地将... 作为字符串文字传递),而任何表达式(例如$ChangeDate.Year)都被识别。 p>

    • 一般来说,最安全的方法是使用可扩展(插值)字符串(双引号;"...")作为-Filter 参数和“烘焙”变量值;也就是说,PowerShell 将变量引用替换为其值 AD 提供程序看到字符串之前。

    • 但是,不清楚 date 值必须如何在这样的字符串中表示才能被识别,因此利用 AD 提供者提供的变量解释恰好是 this 情况下最安全的选择(注意使用 引号 ('...'),这意味着字符串按原样传递 - 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'
    作为字符串值,包括单引号,这不是你想要的。

    【讨论】:

    • 我正在尝试执行此操作(使用 Get-ADComputer),其中一个过滤器需要为'OperatingSystem -like "<os>"',其中<os> 是一个可能包含空格的变量,例如"*windows 7*"。我可以使用'OperatingSystem -like $os',它可以工作,但这有点吓人,因为你并没有真正引用$os 的值。然而'OperatingSystem -like "$os"' 不返回任何结果并且'OperatingSystem -like ``"$os``"'(markdown 不会让我在那里使用单个反引号)引发解析错误。如何确保$os 中的空格被安全引用,或者我不需要担心?
    • @mmseng:'OperatingSystem -like $os' 的工作得益于 AD 提供商识别简单变量引用的能力。如果要让 PowerShell 预先执行字符串插值,则必须使用"...",而不是'...':即使用"OperatingSystem -like '$os'""OperatingSystem -like `"$os`""
    • 这对于$os 的单个查询很好,但我看不出你如何将它与日期结合起来,正如你提到的,AD 提供商也需要引用和安全解释在你的回答中。也就是说,"LastLogonTimeStamp -lt `"$time`" -and OperatingSystem -like `"$os`""'LastLogonTimeStamp -lt "$time" -and OperatingSystem -like "$os"' 都不能正常工作。
    • @mmseng:要使用日期时间变量,您必须依赖于 AD 提供者的变量访问;无论何时:使用外部单引号 ('...') 并且在操作数周围使用嵌入式引号:'LastLogonTimeStamp -lt $time -and OperatingSystem -like $OSFilter',但请记住,只有简单的变量引用,而不是具有属性访问权限的表达式用过的。如果您有后续问题,请创建一个新问题帖子。
    猜你喜欢
    • 2015-08-18
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2013-05-08
    相关资源
    最近更新 更多