Я пытаюсь получить список пользователей, которые являются членами группы Active Directory, которая не отключена. Лучшее, что мне удалось найти, это:
dsquery group -name "Group name" | dsget group -members -expand | dsget user -samid -disabled -c | findstr /c:" no "
... признавая, что последний 'findstr' является полным взломом (и, к сожалению, он также удаляет заголовки столбцов.)
Мне удалось найти следующую команду dsquery, которая дает список всех не отключенных пользователей:
dsquery * -filter "(&(sAMAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" -limit 0 | dsget user -samid -c
... но добавив memberOf
параметр работает только для групп, в которые непосредственно входят пользователи; это не рекурсивно как dsget group
с -expand
делает.
Итак, есть ли способ объединить их, или заставить dsquery рекурсировать, или я зашел так далеко, как смог, без использования PowerShell? (Что я не могу, потому что его инструменты зависят от веб-служб Active Directory, которых нет на контроллерах домена на основе Samba, по крайней мере, с Samba 4.9.5.)
Этот синтаксис у меня сработал. Он использует LDAP_MATCHING_RULE_IN_CHAIN правило OID (1.2.840.113556.1.4.1941), чтобы проверить полное происхождение объекта:
dsquery * domainroot -limit 0 -r -filter "(&(objectCategory=user)(memberOf:1.2.840.113556.1.4.1941:=CN=Group Name,OU=Security Groups,DC=domain,DC=com)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"
Обязательно замените пример строки отличительного имени (memberOf = CN = имя группы, OU = группы безопасности, DC = домен, DC = com) на DN группы, для которой вы запрашиваете рекурсивное членство.
Этот запрос возвращает DN каждого включенного пользователя в группе. Если вы конкретно хотите получить sAMAccountName и страну, используйте:
dsquery * domainroot -limit 0 -r -filter "(&(objectCategory=user)(memberOf:1.2.840.113556.1.4.1941:=CN=Group Name,OU=Security Groups,DC=domain,DC=com)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" -attr sAMAccountName co