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