Назад | Перейти на главную страницу

Powershell - поиск пользователей, принадлежащих более чем к одной группе AD

Я новичок в AD и Powershell, поэтому, пожалуйста, простите меня, если я использую неправильную терминологию.

У меня есть серия из 50+ групп Active Directory под названием «ABC-something». Каждый активный пользователь должен принадлежать ровно к одной группе. Пользователи также являются членами других групп, которые используются для других целей и не должны влиять на это упражнение.

Поскольку мы находимся в середине большого шага, мое население - движущаяся цель. Я имею дело примерно с 1000 пользователями, поэтому экспорт всех членств для всех пользователей нежелателен.

Я надеюсь, что смогу написать сценарий, который будет возвращать идентификатор пользователя (или samAccountName) каждого пользователя, который является членом более чем одной группы ABC *, который я мог бы запускать по запросу. (Я предполагаю, что написание сценария для поиска активных пользователей AD НЕ в группе - это совсем другой вопрос.)

Надев шляпу базы данных, я вижу следующую логику:

1) Обходите все группы, называемые ABC *. Для каждого захватите всех членов группы. У меня должна получиться таблица или объект в памяти, выглядящие как

Группа 1 человекA
Группа 1 человекB
Группа 2 человекB

2) Найдите способ сгруппировать, подсчитать или перебрать этот список.

Вот где я застрял, потому что примеры Powershell, которые я видел до сих пор, не сильно манипулируют данными перед экспортом или отображением данных.

Можете ли вы предложить образец сценария для начала или хотя бы указать на онлайн-ресурсы по управлению данными в Powershell?

С помощью Get-ADUser -Filter * -Properties memberOf получает список всех пользователей и групп, в которых они состоят.

Вы можете передать это в foreach или where-object и применить любые необходимые критерии. Если вы хотите узнать, находится ли пользователь в foo и bar, вы можете запустить такую ​​команду.

Get-ADUser -Filter * -Properties memberOf | `
Where-Object {
    $_.memberof.contains('CN=foo,OU=allsites,DC=example,DC=org') -and `
    $_.memberof.contains('CN=bar,OU=allsites,DC=example,DC=org' ) 
}

Или, допустим, вы просто хотели знать, сколько людей было по крайней мере в 7 группах?

Get-ADUser -Filter * -Properties memberOf | `
Where-Object {$_.memberof.count -ge 7}

Если вы просто не настроены смотреть на это с точки зрения групп, я бы вместо этого пробежался по каждому пользователю и посмотрел на их членство в группах:

$Users = get-aduser -filter '*' -ResultSetSize 10

foreach ( $User in $Users ) {
    $uGroups = Get-ADPrincipalGroupMembership $User
    if ( $uGroups.Count -ne 1 ) {
        "{0} is a member of the following {1} groups:" -f $User.SamAccountName, $uGroups.Count
        foreach ( $group in $uGroups ) {
            "`t{0}" -f $group.Name
        }
    }
}

В -ResultSetSize 10 в первой строке предназначена только для тестирования, полностью удалите эту часть, чтобы запустить ее для всего домена. Это будет перебирать пользователей и перечислять людей с более чем одной группой и то, что они собой представляют.

Get-ADGroup и Get-ADGroupMember должен работать аналогично приведенным выше командам для пользователей.

Вы также можете использовать что-то вроде следующего в качестве начала, чтобы взглянуть на это с групповой стороны уравнения:

Get-ADGroup 'ABC-something' | Get-ADGroupMember

Powershell может сделать здесь большую часть тяжелой работы. В этом примере я использую командлеты Quest AD, но стандартные также должны работать.

$FullList = @(ForEach $group in (Get-QADGroup -Identity ABC_))
{
    Get-QADGroupMember $group|Select @{name="Group";expression={$group.Name}}, @{name="Member";expression={$_.SAMAccountName}}
} )

$FullList | Group-Object -Property Member |Where {$_.Count -gt 1}

Дает вам вывод всех имен учетных записей SAM пользователей и количество групп, в которых они находятся, если больше единицы.