Выгрузка пользователей Active Directory в файл

Опубликовано: 04.12.2020
Автор: Виталий Бочкарев
Поддержать автора статьи по этой ссылке

В работе администратора домена встречаются задачи, когда нужно проанализировать какой-то лог, в котором указаны аккаунты пользователей или даже их SID, а для отчета необходимы имена и фамилии людей. Для решения задачи сопоставления SamAccountName и objectSID с именем пользователя я использую таблицу-выгрузку из Active Directory, в которой есть все нужные мне поля: NameSamAccountNameobjectSid, 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, который лежит на рабочем столе пользователя, который запускал скрипт.