Я нашел этот сценарий только что: distsort.sh
Я не помню то, для чего я использовал его или если это работало, таким образом сообщите мне, работает ли это на Вас.
Базовый алгоритм того, что вы ищете, выглядит примерно так (во всяком случае, по моему мнению):
Теперь о фактических вещах, похожих на код.
Перечисление всех групп с префиксом (непроверено, будут ошибки):
$RecurseList=dsquery group -name "abc-*"
$TargetList=$RecurseList
foreach $Grp in $RecurseList {
# Now get the members of that group, do not expand
$GrpMembers=dsget group "$Grp" -members
foreach ($Member in $GrpMembers) {
$isGroup=dsget group $Member
if ($isGroup.dn -eq $Member) {
$TargetList.add("$Member")
RecurseIntoGroup($isGroup.dn)
}
}
}
Затем, когда придет время обсудить список CSV, узнайте членство пользователя , и проверьте, существует ли эта группа в $ TargetList выше. Если это так, удалите его.
Это чертовски много работы, которую нужно выполнить при удалении только одного пользователя из потенциально тысяч групп, но если вы делаете МНОГО из них, то заранее созданный список будет сэкономьте ваше время.
Если вам нужно сделать это только для нескольких пользователей (скажем, 10 или около того), вы можете вернуться назад по дереву.
$UserGroups = dsquery user -name $Username -memberof
foreach ($uGroup in $UserGroups) {
if (isConcerning($uGroup)) {
$ConcerningGroups.add("$uGroup")
}
}
function isConcerning {
param ($uGroup)
$parentGroups=dsget group $uGroup -memberOf
$found=$False
foreach ($pg in $parentGroup) {
if ($parentGroup.startswith("abc-")) {
return($true)
$found=$true
} else {
$concerning=isConcerning($pg)
if ($concerning) {
return($true)
$found=$true
}
}
}
if (-not $found) {
return($False)
}
А затем удалить соответствующие группы по мере необходимости.
Предполагая, что вы хотите удалить КАЖДОГО пользователя из всех групп с конкретный префикс, не основанный на каких-либо других критериях (например, удаление пользователей abc из групп xyz и пользователей xyz из групп abc). Тогда вы могли бы сделать это вот так. Но сначала пара моментов:
$ user.Identity
на $ user. SAMAccountName
) $prefix = "CN=abc-*"$userlist = Import-CSV userlist.csv
foreach ($user in $userlist) { $currentuser = Get-ADUser $user.Identity -properties memberof $grouplist = $currentuser.memberof
foreach ($group in $grouplist) { if ($group -like $prefix) { Get-ADGroup $group | Remove-ADGroupMember -members $currentuser -Confirm:$false } } }
Если вам нужно искать рекурсивно, вам нужно будет попробовать что-то еще. вы можете взглянуть на пункт 11 в этой публикации , чтобы узнать, помогает ли это.