Как системному администратору, отвечающему за 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 классом Directory
$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. Теперь скрипт будет отрабатывать при каждом входе пользователя в систему, в результате получится что то вроде этого.
Очень мудрёно, а главное что для админа совсем не удобно работать с результатом. Это надо лезть в 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;