【问题标题】:Having some trouble filtering Get-ADUser using whenCreated powershell command使用 whenCreated powershell 命令过滤 Get-ADUser 时遇到一些问题
【发布时间】:2021-08-19 19:32:45
【问题描述】:

我可以使用一些帮助来构建/嵌套以下 powershell 代码来获得所需的结果。

当我使用命令时:

Get-ADGroupMember -Identity $groupname | 
    Get-ADUser -Properties * -Erroraction Ignore | 
        select @{N='UserName';E={$_.UserPrincipalName}} | 
            Export-csv $filename -NoTypeInformation

它按预期工作,仅从 AD 组 $groupname 中选择人员,但是当我修改代码并尝试根据帐户创建时间仅过滤新帐户时,它现在包括不在其中的用户帐户那个组

Get-ADGroupMember -Identity $groupname | 
    Get-ADUser -Filter { whenCreated -ge $when } -Properties * -Erroraction Ignore | 
        select @{N = 'UserName'; E = { $_.UserPrincipalName } } | 
            Export-csv $filename -NoTypeInformation

我不确定为什么它现在在我们的 AD 中包含所有新用户帐户,甚至包括组之外的一些 $groupname

【问题讨论】:

    标签: powershell get-aduser


    【解决方案1】:

    在对象中管道时不能使用-Filter。如果您在对象中使用管道,Get-ADUser 将假定您想要获取它们。然而,这归结为参数绑定错误,因为您设置了-ErrorAction Ignore,所以您没有收到本来应该这样说的错误反馈。

    您应该在获取我们知道凭借其组成员身份而存在的 AD 用户时遇到任何问题。所以,我会质疑你是否真的需要忽略错误。也就是说,删除-ErrorAction Ignore 不会解决参数绑定问题。为此,恐怕您将不得不使用Where{} 子句进行后过滤。例如:

    $When = (Get-Date "12/31/2020").ToUniversalTime()
    
    Get-ADGroupMember -Identity $groupname | 
    Get-ADUser -Properties WhenCreated | 
    Where-Object{ $_.WhenCreated -ge $when }
    Select-Object @{Name = 'UserName'; Expression = { $_.UserPrincipalName } } | 
    Export-csv $filename -NoTypeInformation
    

    注意:该属性以UTC格式存储,因此通过转换我们感兴趣的本地时间,我们应该得到正确的结果。

    注意:您不需要获取所有属性。 UserPrincipalName 包含在默认集中。要进行后过滤,您必须将WhenCreated 添加到结果中。

    旁白:尽量不要将脚本块用于-Filter 参数。如果您查看Get-ADUser help documentation,您会发现该参数实际上是字符串类型的。因此,指定一个脚本块需要在后台进行重铸,并可能导致问题。因此,如果您要在此项目或其他地方使用 -Filter 参数,只需使用常规字符串,例如:-Filter "Name -like '*steve*'"

    另一边: [DateTime] 如由Get-Date 返回的-Filter 参数不能直接使用。这可能与 cmdlet 操作 WhenCreated 的 If、when 和方式有关。 WhenCreated LDAP 属性的值存储方式更像“20200820040000.Z”,因此您可以分别调整为用作-Filter-LDAPFilter 参数,如下所示:

    $when = (Get-Date '8/20/20' ).ToUniversaltime().ToString('yyyMMddHHmmss.Z')
    
    Get-ADUser -Filter "WhenCreated -ge '$when'"
    

    或者-LDAPFilter

    Get-ADUser -LDAPFilter "(whencreated>=$when)"
    

    如果我能找到有关可过滤属性的文档,我会跟进。

    更新:

    根据@SantiagoSquarzon 的cmets,您可能根本不想使用Get-ADGroupMember,因为您可能会将非用户对象传递给Get-ADUser。结合他的建议,一个例子可能看起来像:

    $when = (Get-Date '8/20/20' ).ToUniversaltime().ToString('yyyMMddHHmmss.Z')
    
    $groupDN = (Get-ADGroup -Identity $groupname).DistinguishedName
    
    Get-ADUser -LDAPFilter "(&(memberOf=$groupDN)(whencreated>=$when))" | 
    Select-Object @{Name = 'UserName'; Expression = { $_.UserPrincipalName }} | 
    Export-csv $filename -NoTypeInformation
    

    【讨论】:

    • 很好的答案,我认为重要的是要注意 Get-ADuser 可以 假设该组有一个不是 user 对象的成员,这就是为什么我会始终推荐 Get-ADUser -LDAPFilter "(&(memberOf=$groupDN)(whencreated>=$when))" 假设 $groupDN 具有相关组的 DistinguishedName`,并且根本不使用 Get-ADGroupMember(讨厌那个 cmdlet:P)
    • 停止仇恨兄弟。开个玩笑,很好的补充答案!我将编辑以添加它与信用... 想想它总是让我烦恼 Group cmdlet 不处理非用户/组对象。例如邮件联系人。我更喜欢 QAD cmdlet,但它们对 .Net 的依赖使它们站不住脚。再次感谢您的意见。
    • 哇,感谢大家为我分解它我认为这是管道的问题,但我对 powershell 很陌生。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2020-02-28
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    相关资源
    最近更新 更多