В работе администратора домена встречаются задачи, когда нужно проанализировать какой-то лог, в котором указаны аккаунты пользователей или даже их SID, а для отчета необходимы имена и фамилии людей. Для решения задачи сопоставления SamAccountName и objectSID с именем пользователя я использую таблицу-выгрузку из Active Directory, в которой есть все нужные мне поля: Name, SamAccountName, objectSid, Enabled и прочие.
Например у меня есть лог веб-сервера IIS, в котором колонка csusername содержит SamAccountName или objectSid пользователя, который запросил страничку сайта. В Excel с помощью функции ВПР можно легко сцепить таблицы и вывести для каждого запроса имя пользователя.
Ниже представлен скрипт PowerShell, который выгружает список пользователей из AD в CSV-файл.
#--- Variables --- # Контейнер поиска пользователей $ADSearchBase "CN=Users,DC=domain,DC=com" # --- Functions --- # Функция получения свойств пользователя из Active Directory Function GetUserInfo ($UserAccount) { # Создание нового объекта пользователя и добавление в него пустых свойств $UserProperties = New-Object System.Object $UserProperties | Add-member -MemberType NoteProperty -Name Name -Value $Null $UserProperties | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $Null $UserProperties | Add-Member -MemberType NoteProperty -Name Enabled -Value $Null $UserProperties | Add-Member -MemberType NoteProperty -Name passwordlastset -Value $Null $UserProperties | Add-Member -MemberType NoteProperty -Name passwordneverexpires -Value $Null $UserProperties | Add-member -MemberType NoteProperty -Name mail -Value $Null $UserProperties | Add-member -MemberType NoteProperty -Name employeeID -Value $Null $UserProperties | Add-member -MemberType NoteProperty -Name objectSid -Value $Null $UserProperties | Add-Member -MemberType NoteProperty -Name Site -Value $Null $UserProperties | Add-Member -MemberType NoteProperty -Name Country -Value $Null # Получение свойств пользователя из Active Directory $V0 = Get-ADUser -Filter {SamAccountName -eq $UserAccount} -properties passwordlastset, passwordneverexpires, employeeID, mail, objectSid # Заполнение свойств пользователя $UserProperties.Name = $V0.Name $UserProperties.SamAccountName = $V0.SamAccountName $UserProperties.Enabled = $V0.Enabled $UserProperties.PasswordLastSet = $V0.passwordlastset $UserProperties.PasswordNeverExpires = $V0.passwordneverexpires $UserProperties.Mail = $V0.Mail $UserProperties.employeeID = $V0.employeeID $UserProperties.objectSid = $V0.objectSid # В этом примере структура контейнеров в AD устроена по принципу CN=Users, затем OU=Страна, затем OU=Город # Поэтому от полного имени объекта отделяются 2 предпоследних члена, чтоб заполнить Страну и Город $V1 = ($V0.DistinguishedName).Split(",") $UserProperties.Site = ($V1[1]).Substring(3) $UserProperties.Country = ($V1[2]).Substring(3) Return $UserProperties } # --- Start --- Import-Module ActiveDirectory # Текущая дата $TodayDate = Get-Date -Format "yyyy-MM-dd" # Путь к файлу с отчетом $OutFile = (Get-Childitem env:USERPROFILE).Value + "\Desktop\" + $TodayDate + "_UsersList.csv" If (Test-Path $OutFile) { Remove-Item -Path $OutFile } # Список пользователей объекта Active Directory, о которых нужно получить отчет $Users = Get-ADUser -Filter '*' -SearchBase $ADSearchBase Write-Host ($Users.Count.ToString() + " users found") # Выгрузка свойств пользователей в файл $Users | sort-object Name | ForEach-Object {Write-Host ($_.SamAccountName + " is being processed"); GetUserInfo($_.SamAccountName)} | ` Export-Csv $OutFile -Delimiter "`t" -Encoding UTF8 -NoClobber -NoTypeInformation Write-Host Write-Host "The result is in $OutFile file."
В результате работы скрипта получается файл Дата_UsersList.csv, который лежит на рабочем столе пользователя, который запускал скрипт.