Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


среда, 8 февраля 2017 г.

bash, AD: выбор пользователей из группы, входящих и в другую группу

Есть в нашем домене группа, куда добавлены работники разных филиалов, но мне надо обработать только тех, что находятся в моем филиале. Причем не всех, а только из отдельных подразделений.
В свое время я предлагал сделать возможность создания вложенных OU, чтобы группировать пользователей по отделам внутри филиала. В ответ узнал очень много о своей умственной неполноценности.
Не буду сейчас характеризовать тех, кто этого добивался - свалить всех в одну кучу, потому что свои проблемы я решил. Не так эффективно, как можно было, но для моих целей достаточно. А как они там фигачат километровые скрипты на PowerShell, чтобы найти жемчужинку в тоннах информационного навоза, меня не касается.
Однако, изменить структуру домена я не могу, поэтому приспосабливаемся.

Итак, задача:
1. есть группа, в которую свалены работники разных филиалов. Все логины имеют вид фамилия_инициалыN, где N - цифра, добавляемая в случае совпадения фамилии и инициалов (вонючий костыль вместо того, чтобы разрешить создавать субдомены)
2. мне надо отобрать своих
3. что-то с этими своими сделать.



Решение:
1. получаем список членов той группы и для простоты сохраняем в файл:

net rpc group members перемешанная_группа -P -S контроллер_домена>/tmp/PGusers

2. просматриваем этот файл и для каждого попавшего в него сотрудника смотрим список групп, в которых он состоит. Если при этом он попадает в мою группу "все мои пользователи", то выводим его логин на экран, в противном случае молча работаем дальше

for a in `cat /tmp/PGusers`; do id $a|grep -q группа_все_мои_пользователи; if [[ $? -eq 0 ]]; then echo $a; fi; done

На выходе имеем только тех моих пользователей, которые входят в перемешанную_группу.
Кто мне покажет аналогичный способ на PS, причем столь же короткий в записи, буду рад.

Запихать команду (1) в качестве счетчика цикла в команде (2) не получилось - почему-то тогда id-у передается неправильное имя пользователя и он ругается, что не может такого найти.

Расшифровка команд:
1. Параметр -P указывает, что для доступа к ADDS используется учетная запись компьютера, это позволяет обойтись без ввода пароля.
-S - контроллер домена, к которому обращаться. Не обязательно, но желательно.
Если у вас только один домен, то перед перемешанной_группой его указывать не надо, достаточно просто имени.

2. цикл for пробегает по всем строкам файла /tmp/PGusers, присваивая их по очереди переменной $a/
для каждого значения выполняется команда id, возвращающая список групп, членом которых является пользователь. Её вывод обыскивается на наличие в нём уникального имени группы, куда включены все мои пользователи. При этом grep с ключом -q ничего не выводит, а лишь сигналит кодом завершения о результате обыска: 0 - всё нормально, нашли такую подстроку, не 0 - такой подстроки не было.
И если grep -q вернула ноль, то выводим имя этого пользователя, в противном случае обрабатываем следующего.

Команды можно подшлифовать и оптимизировать, но для моих целей скорость их выполнения, а особенно результаты вполне достаточны.

Дополнительный способ решения:

1. Получаем списки членов обеих групп. Для удобства сортируем их и сохраняем в два разных файла
2. сравниваем:

diff -y -W 60 -t первый_файл второй_файл

получаем вывод из двух столбцов, где всё наглядно видно.

-y - выводить различия "бок о бок"
-W - использовать для вывода не более стольки-то символов
-t - заменить табуляции на пробелы (чтобы потом скопированный/сохраненный текст не разъезжался)

p.s. Возможно, через PS это можно сделать немного проще, проверяя содержимое CN в команде dsget, но потом начинаются проблемы с обработкой вывода, поскольку мне нужен только список логинов. Подкоманды уборки мусора из текстовых строк - это отдельные километры текста, совершенно необходимого с т.з. Microsoft.

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

Отправить комментарий

Пожалуйста, воздержитесь от грубостей и персональных нападок.
Я не против матерщины, но она должна быть уместной и использоваться для выражения эмоций, а не в качестве основного средства выражения мыслей.