Powershell действует по-разному для значений и массивов?

Powershell действует по-разному для значений и массивов?

Я пытаюсь получить некоторую информацию из Active Directory с помощью Powershell, но получаю странное поведение. Вот мой скрипт:

$toFind = ( 'bobjones', 'samsmith' )

filter Get-AdUser {
    $strFilter = "(&(objectCategory=User)(sAMAccountName=$_))"

    $objDomain = New-Object System.DirectoryServices.DirectoryEntry
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.PageSize = 1000
    $objSearcher.Filter = $strFilter

    $colProplist = ("name", "department")
    foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}

    ($objSearcher.FindAll() | %{$_.Properties})
}

"paul" | get-aduser # Works
$toFind | get-aduser # Doesn't work?!

Первый вариант выводит то, что я и ожидал, таблицу свойств; второй просто выводит "0 1" несколько раз, хотя я не уверен, почему. Почему одиночный вариант работает, а массив нет?

решение1

То, что вы хотите сделать, это запросить Глобальный каталог, поскольку вы хотите искать по всему лесу. Есть несколько подходов, но самый простой — изменить корень поиска на GC. Например

$objSearcher.SearchRoot = [ADSI]"GC://$($objDomain.Name)" 

В качестве альтернативы вы можете запросить лес, а затем запросить у него список глобальных каталогов и использовать один из них в качестве начальной записи каталога, но это достаточно простое изменение, которое сделает то, что вам нужно, при условии, что поля, которые вы ищете, находятся в GC. Часть поиска не должна быть проблемой в вашем случае, поскольку вы ищете по имени пользователя, которое является глобальным по умолчанию, но вы не получите поле Department из результата поиска, потому что Department не является глобальным по умолчанию. Чтобы получить его, вам нужно будет использовать Distinguished Name из результата поиска, чтобы выполнить последующий поиск AD по домену пользователей для полного объекта пользователя AD, а затем вытащить Department из него. Вы можете изменить свою схему так, чтобы Department был глобальным, но это было бы немного радикально, по моему мнению.

Вы можете найти полный списокглобальные атрибуты по умолчанию здесь.

решение2

Возможно, вам придется указать цикл foreach, например foreach ($user in $toFind) { get-aduser $user }

Что произойдет, если вы просто введете $toFind в приглашении? Я предполагаю, что он выведет оба имени, по одному на строку, как и должно быть.

Я попробовал запустить этот же код на моем AD и получил следующие результаты: 0 1

Имя Значение ---- ----- имя {Sahnti L. Aphil} adspath {LDAP://CN=Sahnti L. Aphil,OU=Пользователи,OU=Джексон,DC=компания,DC=локальный} 0 1 имя {Hamong Justice} adspath {LDAP://CN=Hamong Justice,OU=Пользователи,OU=Джексон,DC=компания,DC=локальный}

решение3

Замечание: я настоятельно рекомендую изучить пакет командлетов Quest AD (http://www.quest.com/powershell/activeroles-server.aspx) для всех вещей PowerShell, связанных с AD. Это заполняет пробел, поскольку встроенная поддержка AD в PowerShell довольно паршивая. Это сэкономит вам кучу времени на разработку.

решение4

FYI, причина, по которой вы получаете вывод 0 и 1, заключается в том, что вызов $objSearcher.PropertiesToLoad.Add() возвращает индекс свойства, которое было добавлено (0 для первого свойства, 1 для второго). Это произойдет один раз для каждого пользователя в вашем скрипте. Вы можете подавить возвращаемое значение, передав его в Out-Null.

Связанный контент