Как искать членов группы или объекта с помощью adsi

#powershell #member #adsi #directorysearcher

#powershell #Участник #adsi #directorysearcher

Вопрос:

У компании есть структура AD, которая мне нужна для поиска имен групп, членом которых является пользователь. Я знаю, что это должно быть в атрибуте «memberof» для пользователей, давайте просто скажем, что это не всегда правильно.

Я попробовал приведенный ниже код, чтобы найти имя пользователя (или objectname) в атрибуте «участники» для всех групп в подразделении, а затем вернуть название группы. К сожалению, я думаю, что я что-то упускаю. Обратный поиск (т.Е. перечисление членов группы) работает, но в моем случае я не знаю названия групп. Также мне нужны все группы, а не только одна.

 uname ="*anyoldusername*"

$Searcher = [ADSISearcher]"(member=$uname)"
$Searcher.SearchRoot = [ADSI] "LDAP://mydomainsearchroot"
$Searcher.PageSize = 10000
$result = $Searcher.FindAll().Properties.cn

echo $result
  

Комментарии:

1. Почему вы не используете get-adprincipalgroupmembership ?

2. Мне нужно использовать решение, в котором мне не разрешено использовать модуль ad. Я ограничен adsi и powershell 2.0

3. Если MemberOf неверно, у вас более серьезные проблемы.

4. Да, это правильно. К сожалению, я не могу изменить эту часть.

Ответ №1:

Это должно сделать это:

 $UserName ="TestUser"
$Searcher = [ADSISearcher]""
$Searcher.SearchRoot = [ADSI]"LDAP://mydomainsearchroot"
$Searcher.Filter = "Name=$UserName"
$UserDN = $Searcher.FindOne().properties.distinguishedname
$Searcher.Filter = "(member:1.2.840.113556.1.4.1941:=$UserDN)"
$Searcher.PageSize = 10000
$result = $Searcher.FindAll().Properties.cn
$result
  

Первый поиск заключается в том, чтобы найти DN пользователя, поскольку это требуется для фильтра при следующем поиске. Чтобы узнать больше о фильтре «1.2.840.113556.1.4.1941», смотрите эту документацию.

О, и echo — это псевдоним для вывода на запись в Powershell, лучше использовать его напрямую или даже полностью опустить, поскольку для отдельной строки или переменной по умолчанию все равно будет использоваться вывод на запись, как вы можете видеть, когда в конце выполняется $result.

Комментарии:

1. Спасибо! Я попробую! Echo было там, чтобы показать, получил ли я что-нибудь в переменной или нет. Основной скрипт выводит результаты в текстовое поле в графическом интерфейсе.

2. Круто, дайте мне знать, если у вас возникнут какие-либо вопросы. Также для пояснения, переменная сама по себе будет иметь точно такой же вывод, как echo.

3. Получено странное сообщение об ошибке: ««` Произошла ошибка при перечислении через коллекцию: доступно больше данных. . В строке: 8 символ: 1 $result = $Searcher. FindAll(). Properties.cn ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Информация о категории: недопустимая операция: (System. Director…sultsEnumerator:ResultsEnumerator) [], исключение RuntimeException FullyQualifiedErrorId: неверная нумерация ««` Я использую тайм-аут здесь?

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

5. Как указывалось ранее, у AD здесь проблемы посерьезнее. 😀 В любом случае, ценю помощь! Еще раз спасибо!