С помощью Get-ADUser удобно решать любую задачу извлечения списка пользователей, отвечающих заданному критерию. Однако для этого необходимо создать фильтр, содержащий один или несколько атрибутов учетной записи, выбранных из общего числа атрибутов свыше 100. Самое трудное — выбрать нужный атрибут, для этого требуется проанализировать их список. Для вывода списка атрибутов воспользуемся командой:

get-aduser -filter *-properties *|get-member

Среди атрибутов, возвращаемых командой get-member и имеющих в имени запись logon, самыми перспективными кажутся LastLogon, LastLogonDate, LastLogonTimestamp и LogonCount. В документации MSDN по схеме AD можно прочитать, что атрибуты LastLogon и LastLogonDate не помогут решить нашу задачу, поскольку не реплицируются между DC, а LastLogonDate и вовсе отсутствует на схеме, поэтому остановимся на LastLogonTimestamp. Надо сказать, я немного лукавлю: большинство специалистов по AD знают атрибут LastLogonTimeStamp c 2003 года, но я провел эксперимент, как если бы был новичком в работе с AD. Отыскав «атрибут-кандидат», узнаем его типовые значения с помощью следующей команды:

get-aduser -f * -pr lastlogontimestamp | ft samaccountname,
   lastlogontimestamp -auto

Эта команда позволяет извлечь список пользователей, представляя выходные данные в виде отформатированной таблицы (ft) с указанием только значений samaccountname и lastlogontimestamp в максимально компактном виде (параметр -auto). Результат выполнения этой команды в небольшой тестовой среде AD выглядит следующим образом:

samaccountname lastlogontimestamp
——————— —————————
Administrator 129699195295312500
Guest
krbtgt
julesm 129699193327187500

В выходных данных значение параметра lastlogontimestamp — либо огромное число, либо пустое место. Предположив, что пустое место означает «никогда не регистрировался в системе», я проверил это, создав новую учетную запись, никогда не запускавшую сеанс, повторив ввод запроса Get-ADUser и убедившись в отсутствии у данной учетной записи значения lastlogontimestamp. Таким образом, наш запрос сводится к поиску учетных записей с пустым значением lastlogontimestamp.

К сожалению, PowerShell не предусматривает простого способа осуществления такого поиска. Нельзя просто ввести фильтр типа {lastlogontimestamp -eq  ""} или {lastlogontimestamp -eq $null}. Вместо этого приходится задействовать операторы -like (уже знакомый нам) и -not (пока не изученный) следующим образом:

get-aduser -f {-not (lastlogontimestamp -like "*")}

Параметр lastlogontimestamp -like "*" задает поиск записей с непустым атрибутом lastlogontimestamp, то есть записей, отвечающих условию «непустой атрибут LastLogonTimestamp». Оператор -not отрицает любое введенное содержимое и в нашем случае преобразует запрос «найти все непустые записи атрибута» в обратный по смыслу «найти все пустые записи атрибута».

Выполнив этот запрос, мы получим список всех пользователей, никогда не запускавших сеанс работы с системой, однако в выходных результатах будут фигурировать и встроенные учетные записи, такие как krbtgt и Guest, информация о которых является лишней, поэтому наш фильтр требует доработки. При взгляде на учетные записи krbtgt и Guest видно, что они заблокированы. Поэтому необходимо поменять запрос «выбрать всех пользователей с пустым атрибутом lastlogontimestamp» на «выбрать учетные записи пользователей с пустым указанным атрибутом, не являющиеся заблокированными». Такой запрос выглядит следующим образом:

get-aduser -f {-not (lastlogontimestamp -like "*") –and
   (enabled -eq $true)}

Единственное отличие состоит в добавлении оператора -and и еще одного фильтра enabled -eq $true. Этот фильтр содержит условие «не заблокирован», поскольку инструментарий PowerShell для AD предусматривает атрибут по имени enabled вместо disabled и фразу $true для представления логического значения true.

В данном примере было показано, как исследовать структуру и общие значения объекта AD. Затем мы построили более сложный запрос на выявление пустых атрибутов, для чего поменяли условие фильтра на обратное с помощью логического оператора -not и объединили два фильтра, используя оператор -and.

Марк Минаси (www.minasi.com/gethelp) — старший редактор журнала Windows IT Pro, сертифицированный системный инженер по продуктам Microsoft