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