使用 whenCreated powershell 命令过滤 Get-ADUser 时遇到一些问题
Having some trouble filtering Get-ADUser using whenCreated powershell command
我可以使用一些帮助 structing/nesting 下面的 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
在对象中使用管道时不能使用 -Filter
。如果你正在管道中输入对象 Get-ADUser
将假定你想要获取它们。这归结为参数绑定错误,但是,由于您设置了 -ErrorAction Ignore
,因此您没有得到应该这样说的错误反馈。
您在获取我们根据其组成员身份知道存在的 AD 用户时应该会遇到任何问题。所以,我想问你是否真的需要忽略错误。也就是说,删除 -ErrorAction Ignore
不会解决参数绑定问题。为此,恐怕您将不得不求助于 post-带有 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 包含在默认集中。要使用 post-filter,您必须将 WhenCreated 添加到结果中。
旁白: 尽量不要对 -Filter
参数使用脚本块。如果您查看 Get-ADUser help documentation,您会发现该参数实际上是字符串类型。因此,指定脚本块需要在幕后进行重铸,并可能导致问题。因此,如果您要在此项目或其他地方使用 -Filter
参数,只需使用常规字符串,例如:-Filter "Name -like '*steve*'"
另一个旁白: Get-Date
返回的 [DateTime]
不能直接用在 -Filter
参数中。这可能与 cmdlet 是否、何时以及如何操纵 WhenCreated 有关。 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 的评论,您可能根本不想使用 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
我可以使用一些帮助 structing/nesting 下面的 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
在对象中使用管道时不能使用 -Filter
。如果你正在管道中输入对象 Get-ADUser
将假定你想要获取它们。这归结为参数绑定错误,但是,由于您设置了 -ErrorAction Ignore
,因此您没有得到应该这样说的错误反馈。
您在获取我们根据其组成员身份知道存在的 AD 用户时应该会遇到任何问题。所以,我想问你是否真的需要忽略错误。也就是说,删除 -ErrorAction Ignore
不会解决参数绑定问题。为此,恐怕您将不得不求助于 post-带有 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 包含在默认集中。要使用 post-filter,您必须将 WhenCreated 添加到结果中。
旁白: 尽量不要对 -Filter
参数使用脚本块。如果您查看 Get-ADUser help documentation,您会发现该参数实际上是字符串类型。因此,指定脚本块需要在幕后进行重铸,并可能导致问题。因此,如果您要在此项目或其他地方使用 -Filter
参数,只需使用常规字符串,例如:-Filter "Name -like '*steve*'"
另一个旁白: Get-Date
返回的 [DateTime]
不能直接用在 -Filter
参数中。这可能与 cmdlet 是否、何时以及如何操纵 WhenCreated 有关。 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 的评论,您可能根本不想使用 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