.
В Windows и AD есть атрибуты, позволяющие отслеживать последние события регистрации запуска сеанса, однако их анализ — процесс слишком трудоемкий. Один из вариантов предполагает извлечение событий регистрации на каждом контроллере домена (DC) и их сортировку по дате и пользователям для выявления самых последних экземпляров по каждому пользователю. Другой вариант подразумевает проверку значений атрибута пользователя AD lastlogon, которые также не реплицируются контроллерами домена. Поэтому, как и в первом случае, значения lastlogon придется извлекать с каждого DC данного домена, после чего выделить самые последние экземпляры для каждого пользователя.
В Windows Server 2003 и в других версиях, работающих на более высоких доменных функциональных уровнях, есть атрибут AD lastlogontimestamp, реплицируемый между доменными контроллерами. Значения этого атрибута сохраняются в виде длинных целых чисел (на момент написания статьи мое значение атрибута lastlogontimestamp равно 129623232699932000), неудобных для восприятия. Однако разработчики PowerShell для AD предусмотрели преобразование этого числа в наглядное значение, которое называется LastLogonDate и выглядит следующим образом: Суббота, 8 октября 2011 г., 1:07:18 PM. Доступ к этому значению открывает Get-ADUser.
Зная об этом, можно вывести список пользователей, отсортированный по дате последней регистрации в домене:
get-aduser -f * -pr lastlogondate|sort -property lastlogondate|ft samaccountname, lastlogondate -auto
Таким образом, можно запросить любой DC и выяснить, есть ли в домене пользователи, последний раз регистрировавшиеся в домене, скажем, 22 сентября 2011 года. Однако здесь есть определенные нюансы. Атрибут lastlogontimestamp был добавлен в AD в интересах администраторов AD, которым требовался способ контроля событий регистрации запуска сеанса, однако в Редмонде беспокоились о том, что добавление какого-либо механизма отслеживания может существенно повысить трафик репликации AD.
Чтобы уменьшить трафик, связанный с репликацией значений атрибута lastlogontimestamp, контроллеры домена обновляют это значение не чаще чем через 9–14 дней. При каждой регистрации пользователя DC анализирует текущее значение lastlogontimestamp этого пользователя. Затем DC выбирает случайное число между 9 и 14. Если число дней между последним событием регистрации и текущим моментом меньше выбранного случайного числа, то DC не обновляет значение lastlogontimestamp для данного пользователя. Таким образом, значение lastlogontimestamp каждого пользователя обновляется только один раз примерно каждые 12 дней независимо от того, как часто этот пользователь запускает свой сеанс на протяжении данного периода. Такие данные не слишком точны, но это позволяет уменьшить трафик репликации.
Предположим, я регистрируюсь в полдень 20 января 2012 года, а до этого я не входил в домен начиная с 9:00 9 января текущего года. Таким образом, мой сеанс не регистрировался на протяжении 11,25 дня. Мой DC выбирает случайное число между 9 и 14 — предположим, 13,44. Это число (13,44) превышает временной интервал между двумя последними событиями регистрации (11,25), поэтому DC не меняет мое значение lastlogontimestamp после данного запуска сеанса. Таким образом, атрибут lastlogontimestamp, будучи безусловно полезным, может нести некорректную информацию на протяжении 14 дней и не позволяет выявить пользователей, не регистрировавшихся в домене на протяжении последних двух недель. Впрочем, для поиска неактивных пользователей, скажем, за последние шесть месяцев, он очень удобен.
Можно потренироваться в поиске пользователей, не регистрировавшихся в течение последних 180 дней, с помощью Get-ADUser, но разработчики PowerShell для AD облегчили нам задачу, создав команду search-adaccount, позволяющую выполнить этот запрос:
search-adaccount -accountinactive -usersonly -timespan "195"
Запрос выглядит простым, но у команды есть два неочевидных момента. Во-первых, отметим двойные кавычки, окружающие число 195 (обязательное требование параметра -timespan). Во-вторых, обратим внимание на число 195 вместо 180. Вспомним также, что атрибут lastlogontimestamp доступен только домену с функциональным уровнем не ниже Windows 2003. Команда search-adaccount имеет особенность, согласно которой к контрольному периоду неактивности следует добавлять 15 (в действительности добавляемое число не в точности равно 15). О том, чем вызвано такое требование, как узнать точное добавляемое значение, а также об альтернативном синтаксисе поиска неактивных пользователей я расскажу в следующей статье.
Марк Минаси (www.minasi.com/gethelp) — старший редактор журнала Windows IT Pro, сертифицированный системный инженер по продуктам Microsoft