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

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

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

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

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

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

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

Group1 PersonA
Group1 PersonB
Group2 PersonB

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

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

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

4 ответа

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

Вы можете передать это в foreach или where-объект и применить любые необходимые критерии. Если вы хотите знать, был ли пользователь в 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 в первой строке только для тестирования, полностью удалите эту часть, чтобы запустить ее для всего домена. Это будет перебирать пользователей и перечислять людей с более чем 1 группой и их состав.

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 и количество групп, в которых они находятся, если они больше единицы.

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

  • Если какой-либо пользователь входит более чем в одну из этих групп, это будет проблемой и приведет к конфликтам с предпочтениями групповой политики и их условиями «членства».

С помощью ответа здесь я придумал этот вариант, который помог мне автоматизировать рутинный запланированный процесс, который отправляет электронное письмо с подробностями, есть ли какие-либо учетные записи в более чем одной группе из списка групп, определенных в$gпеременная.

По сути, это создает список с иGroup, затем делаетGroup-Objectпротив перечислить только те, у которых его значение больше 1.

PowerShell

      $g = @("group1","group2","group a","group z");
$g | ForEach-Object { 
    $b = $_; Get-ADGroupMember -Identity $_ | Select-Object SamAccountName, @{n="ADGroup";e={$b};}
        } | Group-Object -Property SamAccountName | 
                Where-Object {$_.Count -gt 1};

Пример выходного списка

Примечание. Это образец списка, сгруппированного поgroup-objectчтобы потом показатьSamAccountNameзначения со счетчиком больше 1.

      SamAccountName ADGroup
-------------- -------
jsmith         group1    
bobama         group1    
dtrump         group2    
swalton        group2    
pjuiceit       group a    
aventura       group a    
apowers        group z    
drevil         group z   
Другие вопросы по тегам