Заметки о Windows и других программных продуктах Microsoft...

Получаем информацию о последнем входе пользователя

Получаем информацию о последнем входе пользователя

Как системному администратору, отвечающему за Active Directory, мне иногда приходится отвечать на вопросы типа ″куда и когда заходил вот этот пользователь″. Чтобы иметь возможность быстро получить требуемую информацию, можно записывать данные о входе прямо в свойства пользователя. Для этого надо всего лишь определить имя компьютера и текущее время и занести эти данные в один из свободных атрибутов пользователя в AD, например в описание (Description).

Задача, на первый взгляд, простая и легко решаемая с помощью PowerShell.  Но, скрипт будет выполняться на клиентских рабочих станциях, где использовать PowerShell модуль для работы с AD нельзя. Ведь его там просто нет 🙂 Поэтому придется использовать подручные средства.

С помощью переменных окружения получаем из локальной системы данные о пользователе и компьютере.

$user = $env:USERNAME;
$computer = $env:COMPUTERNAME;

Для получения текущего времени воспользуемся статическим .Net классом DateTime:

$time = [datetime]::Now;

Все это в виде строки помещаем в переменную $string.

$string = ″Logged on $computer at $time″;

Теперь нам надо найти в AD пользователя. Для поиска воспользуемся .Net классом DirectorySearcher. Создаем объект DirectorySearcher:

$Searcher = New-Object DirectoryServices.DirectorySearcher;

Искать будем по всему домену, поэтому в качестве корневой директории поиска указываем имя домена:

$Searcher.SearchRoot = ″LDAP://DC=test,DC=local″;

Дополнительно задаем поиск по всем вложенным объектам:

$Searcher.SearchScope = 2;

Теперь создаем фильтр для поиска пользователя:

$Searcher.Filter = ″(&(objectCategory=person)(objectClass=user)(SamAccountName=$user))″;

Используя результаты поиска, получаем из AD объект пользователя:

$objUser = [adsi]$Searcher.FindOne().Path;

Помещаем в поле Description строку с полученной информацией и сохраняем изменения:

$objUser.Put(″Description″,$string);
$objUser.SetInfo();

 

Сохраняем скрипт и с помощью групповых политик добавляем его в Logon Scripts. Теперь скрипт будет отрабатывать при каждом входе пользователя в систему, в результате получится что то вроде этого.

logon description

 
 
Комментарии

Очень мудрёно, а главное что для админа совсем не удобно работать с результатом. Это надо лезть в AD, искать там нужного пользователя, лезть к нему в свойства. В общем, удовольствие сомнительно. А потом ещё и историю логинов не посмотришь. Гораздо проще пользоваться вот таким скриптом.

$data = (Get-Date).ToString(«dd:MM:yyyy»)
$tim = (Get-Date).ToString(«HH:mm:ss»)
$d = «logon.txt»
$usr = $env:USERNAME
$cmp = $env:COMPUTERNAME
$tab = [char]9
(New-Object -ComObject WScript.Network).MapNetworkDrive(«P:», «\\ServerName\ShareName»)
Set-Location P:
New-Item .\$d -ItemType File
«$usr $tab $cmp $tab $data $tab $tim» -join ‘,’ | Out-File .\$d -Append -Width 600;

Согласен, решение не самое красивое, но свою задачу решает. Насчет удобства — у меня AD открыто всегда, посмотреть данные пара секунд.
Ну а история и все остальное, это реализуется другими средствами. При необходимости.

Хотел это для своих нужд использовать. Но оказалось, что это работает только для доменных админов. Скрипт, запущенные доменным пользователем, никаких изменений внести в AD не сможет. Жаль.

Поспешил комментировать. В общем, надо делегирование в AD сделать на изменение атрибута. 🙂

Анатолий

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

Ответить