我正在努力寻找一个合适的方法来做到这一点。出于这样或那样的原因(不重要,但就是这个原因),我们有很多用户被禁用,但仍然是所有预禁用组的成员。这导致了一些问题,例如分发列表失败、枚举 ACL 困难等。
有谁知道一种简单的方法可以批量删除已禁用用户的组?为了方便起见,它们现在都存在于一个容器中,因此如果可以在容器级别完成,那就很有用。另外,我知道我们可以删除帐户,但对于审计和与我们的人力资源系统的交叉链接来说,这是不可能的。
答案1
此示例批处理文件将执行您所要求的操作。您需要编辑命令dsquery
以使用特定的 StartNode OU --OU=SomeOU,DC=example,DC=com
位:
@ECHO OFF
REM Get list of disabled users in the domain
FOR /F "usebackq delims=;" %%A IN (`dsquery user "OU=SomeOU,DC=example,DC=com" -disabled -limit 0`) DO (
echo User: %%A
REM Enumerate user's group memberOf, exclude "Domain Users" group
FOR /F "usebackq delims=;" %%B IN (`dsget user %%A -memberof ^| find /V "Domain Users"`) DO (
ECHO Group: %%B
REM Remove user %%A from Group %%B
dsmod group %%B -rmmbr %%A
)
)
答案2
使用 Powershell 和可用的 Quest AD cmdlet这里,以下 PowerShell 脚本应该可以解决问题 -
$users = Get-QADUser -Disabled
foreach ($user in $users)
{
Remove-QADMemberOf -Identity $user -RemoveAll
}
答案3
我最近想从(几乎所有)禁用用户中删除组,因此我在 PowerShell v3(不需要第三方软件)中编写了自己的一组函数。
为了可组合性和可重复使用性,我首先编写了一个函数,用于从所有组(除其主要组外)中删除指定的用户。我可以添加一个选项来指定组类型(安全或分发),但目前我不需要该功能。
Function Remove-UserFromGroups ($User) {
$PrimaryGroup = (Get-ADUser $User -Properties PrimaryGroup).PrimaryGroup
Get-ADPrincipalGroupMembership $User |
ForEach-Object {
If ($_.distinguishedName -ne $PrimaryGroup) {
Write-Output "Removing ‘$($User.Name)’ from ‘$_’"
Remove-ADGroupMember $_ -Members $User # -Confirm:$False
}
}
}
然后,我使用此功能从所有组(除其主要组外)中删除所有已禁用的用户。我使用搜索库,以便可以指定 OU,并且我还有一个不应更改其组成员身份的默认/系统用户列表。
Function Remove-DisabledUsersFromGroups (
$SearchBase = 'OU=department,DC=example,DC=com',
$ExcludedUsers = @('krbtgt', 'SUPPORT_388945a0', 'Guest')
) {
Get-ADUser -Filter { Enabled -eq $False } -SearchBase $SearchBase |
Where { $_.Name -notin $ExcludedUsers } |
ForEach-Object {
Remove-UserFromGroups $_
}
}