Powershell脚本用于搜索AD中的特定OU,并查找作为组成员的已禁用用户

时间:2014-10-31 09:11:29

标签: powershell active-directory memberof

我尝试编写脚本来查找已禁用的用户,这些用户是AD中特定OU中一个或多个组的成员。然后,它将删除所有已禁用用户的所有组。我发现这个脚本会从csv文件中的用户中删除所有组,但是因为我希望将其作为计划任务运行,所以我不想处理已经删除了组的用户,而不必将其移动到不同的位置。 OU。

Import-Csv $csvFile | ForEach-Object {
    # Disable the account
    Disable-ADAccount -Identity $_.samAccountName
    # Retrieve the user object and MemberOf property
    $user = Get-ADUser -Identity $_.samAccountName -Properties MemberOf
    # Remove all group memberships (will leave Domain Users as this is NOT in the MemberOf property returned by Get-ADUser)
    foreach ($group in ($user | Select-Object -ExpandProperty MemberOf))
    {
        Remove-ADGroupMember -Identity $group -Members $user -Confirm:$false
    }
}

有关如何使用多个组过滤掉用户的任何想法? 我使用此脚本导出已登录60天的已停用用户:

Get-QADUser -searchRoot $OuDomain -searchScope OneLevel -InactiveFor 61 -NotLoggedOnFor 61 -disabled -sizelimit 0

THX

1 个答案:

答案 0 :(得分:0)

你似乎已经过了ou part down,这很好。您在帖子开头有一些想法,但唯一的实际问题是如何过滤掉多个用户的用户。不确定这是否是一个错字,但我读到这是检查用户拥有的组数。对此的更现实的解释是过滤器用户,其可以具有至少一个组列表。我将覆盖两者。

计数

我确定这不是你想要的,但只想覆盖基地。以下内容也适用于Where-Object子句

If((get-aduser $user -Properties MemberOf).MemberOf.Count -gt 0){Process...}

多个群组

我确定这是你的意图。找到可能包含多个组之一的用户。这最好用正则表达式处理。

$groupsFilter = "citrix_GateKeeper","barracuda_spam_alerts"
$groupsFilter = "($($groupsFilter -join '|'))"
# $groupsFilter in this example is: (citrix_GateKeeper|barracuda_spam_alerts)

If(((Get-ADUser $user -Properties MemberOf).MemberOf) -match $groupsFilter){Process....}

根据多个组的字符串数组创建正则表达式匹配字符串。如果$ user是这些组中的任何一个的成员,那么将返回true。

如果此处没有任何用处,那么我建议您更清楚地提问。希望这会有所帮助。