Марк Минаси (www.minasi.com/gethelp) – старший редактор журнала Windows IT Pro, сертифицированный системный инженер по продуктам Microsoft
В предыдущем номере мы рассмотрели извлечение учетных записей пользователей, принадлежащих группе folks в отделе сбыта компании bigfirm.com. Эту задачу можно было бы попытаться решить с помощью такого запроса:
get-adgroupmember folks | get-aduser –searchbase «ou=sales,dc=bigfirm,dc=com»
Это логично, если вспомнить, как с помощью get-aduser удается компенсировать функциональные ограничения команд search-adaccount и get-adgroupmember. Однако данный вариант не работает, и понимание причин повысит эффективность работы пользователя PowerShell.
Вернемся к рассмотренному ранее примеру успешно работающего конвейера с участием get-aduser:
get-adgroupmember folks | get-aduser -pr lastlogondate
Этот пример демонстрирует обход ограничений get-adgroupmember в части сортировки по свойствам пользователя. В приведенном выше примере get-adgroupmember извлекает все учетные записи, принадлежащие группе folks, и передает их в виде объектов Active Directory (AD) на вход get-aduser, то есть осуществляет конвейерную передачу, обозначаемую символом «|». . Чтобы лучше понять идею конвейера, представим себе сборочную линию со множеством станций на автомобилестроительном заводе. Каждая команда представляет собой одну из станций, где осуществляется определенная операция, например монтируются тормоза или крепится лобовое стекло. Ниже приведен конвейерный запрос, состоящий из трех команд и позволяющий вывести заблокированные учетные записи в виде таблицы, отсортированной по дате последней регистрации:
search-adaccount -u -l | sort -pr lastlogondate | ft name,lastlogondate
Здесь команда search-adaccount генерирует полный список заблокированных учетных записей, передавая его в виде массива объектов команде sort, осуществляющей их сортировку по атрибуту lastlogondate. Выходной результат, каковым является массив тех же объектов, перегруппированных в другом порядке, передается команде format-table (ft) для отображения извлеченных данных на экране в удобном для восприятия виде. Удобство конвейера состоит в том, что в запрос searchadaccount не нужно включать параметр сортировки, а в запросы searchadaccount и sort – параметры, позволяющие отформатировать выходной результат в виде таблицы.
Это возможно потому, что команды PowerShell созданы так, что принимают на вход объекты конвейера, а на выходе, как правило, генерируют пригодные для конвейерной передачи объекты. Однако разные команды проявляют разную степень требовательности в отношении конвейерного входа. В частности, sort принимает практически любые объекты, имеющие, как минимум, одно знакомое свойство (например, имя), либо если запрос содержит указание, по какому свойству следует выполнить сортировку. Format-table визуализирует любые пригодные для отображения данные переданных на вход объектов. Однако get-aduser более требователен. В интерактивной справке говорится, что эту команду следует вызывать как get-aduser -filter атрибут (как в нашем примере), либо как get-aduser -identity идентификатор, что позволяет выводить данные любого единичного объекта по его идентификатору безопасности (SID), SamAccountName, objectGUID или отличительному имени (DN). Существует также третий параметр, -ldapfilter, но мы его пока опустим. Таким образом, get-aduser -identity позволяет извлечь учетную запись одного пользователя по ее SID, имени регистрации, GUID или DN. При этом –identity не допускает использования подстановочных знаков. В интерактивной справке говорится, что при вызове get-aduser без -identity, -filter или -ldapfilter предполагается, что указан параметр -identity. В частности, в запросе
get-adgroupmember folks | get-aduser
при отсутствии параметров предполагается, что после get-aduser указан параметр -identity. В этом случае необходим атрибут samaccountname, objectGUID, идентификатор SID и/или DN. В противном случае команда оказывается в тупике. Например, если взять команду dir в PowerShell, которая возвращает список файлов и папок в текущей папке, то в ответ на запрос
dir | get-aduser
будет выдано огромное множество сообщений об ошибках, поскольку get-aduser окажется перед лицом объектов, не идентифицируемых по атрибутам samaccountname, objectGUID, SID или DN. Конечно, это слишком упрощенное сравнение, но суть его в том, что все команды PowerShell используют конвейер, но неодинаковым образом. Внимательно изучите справочную информацию, прежде чем применять их. В следующей статье мы подойдем к процессу извлечения учетных записей пользователей с другой стороны.