1

我正在尝试编写一个脚本来查找属于 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

谢谢

4

1 回答 1

0

你似乎有过滤器的一部分,这很好。您在帖子开始时有一些想法,但唯一实际的问题是如何过滤掉一组以上的用户。不确定这是否是一个错字,但我认为这是检查用户拥有的组数。一个更现实的解释是过滤可能至少有一个组列表的用户。我将涵盖两者。

伯爵

我确定这不是您想要的,而只是想覆盖基础。以下也适用于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。

如果这里对您没有任何用处,那么我建议您让您的问题更清楚。希望这会有所帮助。

于 2014-11-01T01:47:21.413 回答