【问题标题】:Select users from AD randomly从 AD 中随机选择用户
【发布时间】:2019-04-19 14:06:19
【问题描述】:

我们的任务是创建一个流程,每季度检查一次随机员工的网络流量。我已经在 Powershell 中启动了一个脚本,从特定 OU 中选择 10 个随机用户,但我仍然得到一些不需要的数据。我需要帮助进一步筛选列表。输出为我提供了已禁用并留在 OU 中的用户以及很长时间未登录的 PRN 员工。我想搜索在过去 3 个月内修改过的具有电子邮件地址和登录名的 AD 帐户。这是我到目前为止的代码示例。

Get-ADUser -SearchBase "ou=ouname,ou=ouname,dc=domainname,dc=suffix" -Filter * | Select-Object -Property Name | Sort-Object{Get-Random} | select -First 10

[编辑:已回答的问题]

这是我的最终脚本,添加了$_.passwordlastset 作为搜索属性,因为这将获取在过去 90 天内更改过密码的用户。

$DateFrom = (get-Date).AddDays(-90)

Get-ADUser -Properties * -Filter {enabled -eq $True} -SearchBase "ou=ouname,dc=domainname,dc=suffix" | where { $_.passwordlastset -gt $DateFrom -and $_.mail -ne $null } | Sort-Object {Get-Random} | select name, sAMAccountName -First 10

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:
    
    Get-ADUser -Properties name, mail, lastlogondate -Filter {enabled -eq $True} -SearchBase "ou=ouname,ou=ouname,dc=domainname,dc=suffix" | select name, mail, lastlogondate | where { $_.lastlogondate -gt (Get-Date).AddDays(-90) -and $_.mail -ne $null }
    
    

    从这里开始。

    【讨论】:

    • 我能够从这个 sn-p 中得到我需要的东西。我唯一更改的是将属性设置为通配符-Properties *,添加Sort-Object {Get-Random} | Select -First 10 我将在上面发布我的最终脚本。
    【解决方案2】:

    试试这个:

    $timeFrame = (get-Date).AddDays(-90)
    
    get-aduser -SearchBase 'ou=ouname,ou=ouname,dc=domainname,dc=suffix' -Filter * -Properties * | 
        Where-Object {$_.whenChanged -gt $timeFrame -and $_.mail -ne $null} |
        Select-Object -Property Name | Sort-Object{Get-Random} | select -First 10
    

    【讨论】:

    • WhenChanged 在这里可能不是最好的指标 - 如果一个帐户在过去 90 天内被禁用,它会显示出来
    • 当然。如果您愿意,可以使用 whenChanged 属性。但只是禁用该帐户算作更改,因此它仍会显示。如果您想排除禁用的帐户,那么最好的方法是将它们过滤掉。所以现在你的代码看起来像这样(我发布了另一个答案)。或者您可以使用 LastLogontimeStamp。
    【解决方案3】:

    更改-Filter 值:

    # LastLogontimeStamp is not guaranteed to be updated on every login, so 30 days + 14 days margin
    $threshold = (Get-Date).AddDays(-44).ToFileTime()
    Get-ADUser -Filter {Enabled -eq $true -and LastLogontimeStamp -gt $threshold} -SearchBase "ou=ouname,ou=ouname,dc=domainname,dc=suffix" | Sort-Object {Get-Random} | Select Name -First 10
    

    此过滤器将确保 AD 仅返回已启用的用户,并且他们的 lastLogontimeStamp 值已在过去一个半月内更新

    【讨论】:

    • 如果LastLogontimeStamp 在给定时间段内没有准确检索到登录用户,您是否建议查询其他属性?
    【解决方案4】:

    这将完成 OP 所述的所有操作:

    $timeFrame = (get-Date).AddDays(-90)
    get-aduser -SearchBase 'YourOU,DC=Domain,DC=com' -Filter * -Properties * | 
    Where-Object {$_.whenChanged -lt $timeFrame -and $_.mail -ne $null -and $_.Enabled -eq $true} |
    Select-Object -Property Name | Sort-Object{Get-Random} | select -First 10
    

    这应该通过 sn-ps 满足所有 OPs 检查点:

    “我想搜索具有电子邮件地址的 AD 帐户” $_.mail -ne $null

    "& 一个登录" $_.Enabled -eq $true

    "最近 3 个月内修改" $_.whenChanged -lt $timeFrame

    【讨论】:

    • 我试过这个,我得到了从未登录过的测试帐户。我注意到您将 $_.whenChanged -gt 更改为 $_.whenChagned -lt
    • 是的,这是一个错字。 OP 想要“在”过去 3 个月内,而不是超过它。在我更正的原始帖子中我的监督。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多