O algoritmo base do que você está procurando é algo assim (de qualquer forma, de acordo comigo):
- Enumere todo o grupo com o prefixo certo.
- Seguir de forma recursiva seus membros do grupo para enumerar todos os grupos aninhados neles.
- Depois de obter um grupo sem grupos como membros, pare de recursar.
- Pegue a lista de usuários para cada usuário
- Enumere suas participações no grupo
- Se algum deles tiver o prefixo correto, remova-o dele.
- Se algum dos grupos restantes estiver na lista de grupos enumerados na etapa principal anterior, remova-os dessa lista também.
Agora, para coisas semelhantes a códigos reais.
Enumerando todos os grupos com um prefixo (não testado, haverá bugs):
$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)
}
}
}
Então, quando chegar a hora de falar sobre a lista de CSV, obtenha a associação do usuário e verifique se esse grupo existe em $ TargetList acima. Em caso afirmativo, remova-o.
Este é um monte de trabalho a ser feito ao remover apenas um usuário de potencialmente milhares de grupos, mas se você fizer MUITOS, a lista pré-criada economizará seu tempo.
Se você só precisa fazer isso para alguns usuários (digamos, 10 ou mais), você pode voltar a subir na árvore.
$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)
}
Em seguida, remova os grupos relacionados, conforme necessário.