PowerShell и управление пользователя Active Directory

Я нашел этот сценарий только что: distsort.sh

Я не помню то, для чего я использовал его или если это работало, таким образом сообщите мне, работает ли это на Вас.

1
задан 7 September 2011 в 22:10
2 ответа

Базовый алгоритм того, что вы ищете, выглядит примерно так (во всяком случае, по моему мнению):

  1. Перечислить всю группу с правильным префиксом.
  2. Рекурсивно следовать их GroupMembers, чтобы перечислить все вложенные в них группы.
    1. Как только вы получите группу без групп в качестве участников, прекратите повторение.
  3. Возьмите список пользователей для каждого пользователя
    1. Перечислить их членство в группах
    2. Если какие-то из них имеют правильный префикс, удалите их из него.
    3. Если какая-либо из оставшихся групп находится в списке групп, перечисленных на предыдущем основном шаге, удалите их также из этого .

Теперь о фактических вещах, похожих на код.

Перечисление всех групп с префиксом (непроверено, будут ошибки):

$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)
}

А затем удалить соответствующие группы по мере необходимости.

5
ответ дан 3 December 2019 в 16:19

Предполагая, что вы хотите удалить КАЖДОГО пользователя из всех групп с конкретный префикс, не основанный на каких-либо других критериях (например, удаление пользователей abc из групп xyz и пользователей xyz из групп abc). Тогда вы могли бы сделать это вот так. Но сначала пара моментов:

  1. В каком формате имена пользователей в вашем CSV-файле? Это определит, как вы будете искать пользователя, вам нужно будет соответствующим образом обновить параметр (например, изменить $ user.Identity на $ user. SAMAccountName )
  2. Для этого требуются командлеты AD Powershell, поэтому вам нужно либо сначала импортировать модуль AD (или запустить его в консоли AD Powershell на контроллере домена или компьютере с установленными инструментами администрирования)
  3. следующее будет работать только для прямого членства в группе, но не для рекурсивного членства в группе.

$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 в этой публикации , чтобы узнать, помогает ли это.

5
ответ дан 3 December 2019 в 16:19

Теги

Похожие вопросы