2016-03-25 6 views
0

Я хотел бы получить учетную запись пользователя AD через powershell в пределах определенной группы.Get-ADUser в определенной группе AD

Я буду знать GivenName и Surname пользователя, которого я буду искать, поэтому Get-ADUser выглядит как хорошая функция для использования.

Проблема в том, что у нас в OU большое количество пользователей, и я хочу ограничить область поиска одной группой AD и группами под этой группой AD. Насколько я могу судить, параметр SearchBaseGet-ADUser будет работать только для подразделений, а не для групп.

Я хотел бы сделать это как можно эффективнее (т. Е. Не получить всех пользователей в группе и поиска в пределах этих пользователей).

+0

Что вы подразумеваете под «поисками по определенной группе»? Вы хотите проверить, является ли пользователь членом определенной группы? –

+0

Я хочу найти пользователя по их имени и фамилии, но только в том случае, если они являются членами определенной группы. Я не хочу знать, в какой группе они находятся. Я просто хочу искать только в определенной группе. Я пытаюсь получить их адрес электронной почты от AD - так что я хочу объект пользователя. Если я буду искать «Джон Смит», я получу много результатов во всем домене, но в группе не будет дубликатов, так как он намного меньше. – alex

+0

Если вы хотите повысить эффективность, сделайте это несколькими способами и временем, а затем выберите самый быстрый подход. Невозможно предсказать, как оптимизация алгоритма запроса, используемая AD, повлияет на ваше время поиска. Кроме того, нет способа получить то, что вы просили, т. Е. Получить членов набора без первого набора. – LinuxDisciple

ответ

2

Вы можете использовать Get-ADGroupMember для перечисления членов группы, а также использовать его в качестве входных данных для Get-ADUser:

Get-ADGroupMember 'groupname' | 
    Get-ADUser -Properties EmailAddress | 
    Where-Object { $_.Surname -eq 'foo' -and $_.GivenName -eq 'bar' } | 
    Select-Object -Expand EmailAddress 

Если группа содержит не только пользователем объекты, которые нужно отфильтровать пользователей по классам первой:

Get-ADGroupMember 'groupname' | 
    Where-Object { $_.objectClass -eq 'user' } | 
    Get-ADUser -Properties EmailAddress | 
    Where-Object { $_.Surname -eq 'foo' -and $_.GivenName -eq 'bar' } | 
    Select-Object -Expand EmailAddress 

Для разворачивания вложенных групп вам нужна рекурсивная функция:

function Unroll-Group($group) { 
    Get-ADGroupMember $group | ForEach-Object { 
    switch ($_.objectClass) { 
     'group' { Unroll-Group $_ } 
     'user' { Get-ADUser $_ -Property EmailAddress } 
    } 
    } 
} 

Unroll-Group 'groupname' | 
    Where-Object { $_.Surname -eq 'foo' -and $_.GivenName -eq 'bar' } | 
    Select-Object -Expand EmailAddress 

Обратите внимание, что этот подход не будет работать для основной группы пользователя.

+0

Спасибо Ansgar - как я могу это сделать, если пользователи являются членами подгрупп? То есть, группа представляет собой группу групп, и пользователи являются членами этих подгрупп. – alex

+1

Для разворачивания вложенных групп вам нужна рекурсивная функция. См. Обновленный ответ. –