Фильтр и методы DirectoryServices

Я пытаюсь получить список всех пользователей в OU/DC из AD.

Вот что я придумал:

$erroractionpreference = "SilentlyContinue"
function Get-GroupMembers {
    $filter = "(&(objectCategory=person)(objectClass=user))"
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.Filter = $filter
    $colResults = $objSearcher.FindAll()

        foreach ($member in $colResults) { 
            $member
        }
}
get-GroupMembers 

Если я изменю фильтр на

    $filter = "(&(objectCategory=person)(objectClass=user)("OU=Admin Accounts,DC=admin"))

Ничего не возвращается. Почему это так?
Я также хотел бы отображать определенные значения (если учетные записи активны или отключены и т. д.), но если я передаю $member в gm, я ничего не получаю.

Любая помощь будет принята с благодарностью.


person Bart De Vos    schedule 29.09.2011    source источник
comment
Будьте осторожны, @TiZon, вы смешиваете три вещи. Ajk объяснит вам, как использовать объект ADSI с DirectorySearcher, это работает до PowerShell V1.0. USlackr использует командлеты из модуля ActiveDirectory, доступного в Seven и W2K8R2 в PowerShell V2.0. Кристиан использует командлет из пакета Qest, доступного начиная с PowerShell V1.0. Все 3 решения работают, но не смешивайте три   -  person JPBlanc    schedule 30.09.2011
comment
@JPBlanc: Спасибо за предупреждение!   -  person Bart De Vos    schedule 30.09.2011


Ответы (3)


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

$objOU = New-Object System.DirectoryServices.DirectoryEntry("LDAP://OU=Admin Accounts,DC=admin")
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objOU

Вы также можете контролировать область поиска. Вот два наиболее подходящих варианта для вас:

# Option 1: Return only users in the 'Admin Accounts' OU
$objSearcher.SearchScope = "OneLevel"

# Option 2: Return users in the 'Admin Accounts' OU or any level beneath it
$objSearcher.SearchScope = "SubTree"

Если вы не переопределите корень и область поиска, вы получите по умолчанию выполнение поиска в поддереве относительно корня вашего текущего домена. Вы можете найти более подробную информацию в этой статье TechNet:

Редактировать: Как заметил uSlackr, ваш компонент DC выглядит подозрительно. Я оставил его нетронутым для своего примера, но неполное/искаженное имя базового объекта испортит ваш поиск независимо от используемого вами метода.

person ajk    schedule 29.09.2011
comment
Спасибо, это сработало! Я объединил ваш ответ с помощью @uSlackr - person Bart De Vos; 30.09.2011

Компонент постоянного тока не завершен. Это должно выглядеть примерно так:

 $filter = "(&(objectCategory=person)(objectClass=user)("OU=Admin Accounts,DC=myco,dc=com"))

но dc=admin,dc=com должно переводиться из имени домена AD в этом примере «admin.com», что кажется неправильным

Это намного проще сделать с помощью командлетов Microsoft AD.

get-aduser -filter * -searchbase "ou=test,dc=mycom,dc=com"

Информация о загрузке и использовании командлетов доступна на TechNet

person uSlackr    schedule 29.09.2011
comment
Спасибо, это сработало! Я объединил ваш ответ с помощью @ajk - person Bart De Vos; 30.09.2011

Вы можете попробовать использовать оболочку Quest ActiveRolesManagement Shell для ActiveDirectory, которую можно загрузить отсюда:

http://www.quest.com/downloads/

Пакет является бесплатным и представляет собой более точные командлеты для управления Active Directory из PowerShell.

person CB.    schedule 29.09.2011