Какие данные пользователей Active Directory экспортируем
Наш PowerShell-скрипт получает пользователей из одной или нескольких организационных единиц Active Directory и сохраняет результат в CSV-файл.
Для каждого пользователя в отчёт попадают:
- имя;
- фамилия;
- отображаемое имя;
- логин пользователя;
- User Principal Name (UPN);
- улица;
- город;
- штат или регион;
- почтовый индекс;
- страна или регион;
- должность;
- отдел;
- компания;
- руководитель;
- организационная единица (OU);
- описание;
- офис;
- номер телефона;
- дополнительные номера телефонов;
- электронная почта;
- мобильный телефон;
- пейджер;
- заметки;
- состояние учётной записи;
- дата создания учётной записи;
- дата последнего входа пользователя.
Готовый скрипт можно скачать здесь: Export-ADUsers.ps1.
Что понадобится для экспорта пользователей AD
Скрипт использует командлет Get-ADUser из модуля ActiveDirectory.
Проверить наличие модуля можно командой:
Get-Module -ListAvailable ActiveDirectory
Если команда возвращает информацию о модуле, можно переходить к выполнению скрипта.
PowerShell-скрипт для экспорта пользователей Active Directory
Создайте папку:
C:\scripts
Сохраните следующий код в файл:
C:\scripts\Export-ADUsers.ps1
Сам скрипт:
<#
.SYNOPSIS
Export-ADUsers.ps1
.DESCRIPTION
Export Active Directory users to CSV file.
#>
# Папка для сохранения отчёта
$Path = "C:\scripts"
# Метка даты и времени
$LogDate = Get-Date -Format "yyyyMMdd-HHmm"
# Путь к CSV-файлу
$CsvFile = Join-Path $Path "AllADUsers_$LogDate.csv"
# Импорт модуля Active Directory
Import-Module ActiveDirectory
# Функция получения OU из DistinguishedName
function Get-OUFromDistinguishedName {
param(
[string]$DistinguishedName
)
$ParentPath = ($DistinguishedName -split ',', 2)[1]
if (-not ($ParentPath.StartsWith('OU') -or $ParentPath.StartsWith('CN'))) {
$ParentPath = ($ParentPath -split ',', 2)[1]
}
return $ParentPath
}
# OU, из которых экспортируем пользователей
$DNs = @(
"OU=Sales,OU=Users,OU=Company,DC=exoip,DC=local",
"OU=IT,OU=Users,OU=Company,DC=exoip,DC=local",
"OU=Finance,OU=Users,OU=Company,DC=exoip,DC=local"
)
# Свойства пользователей, необходимые для отчёта
$Properties = @(
"GivenName",
"Surname",
"DisplayName",
"SamAccountName",
"UserPrincipalName",
"StreetAddress",
"City",
"State",
"PostalCode",
"Country",
"Title",
"Department",
"Company",
"Manager",
"Description",
"Office",
"telephoneNumber",
"otherTelephone",
"Mail",
"mobile",
"pager",
"info",
"Enabled",
"WhenCreated",
"LastLogonDate"
)
# Список для результатов
$Report = [System.Collections.Generic.List[Object]]::new()
foreach ($DN in $DNs) {
$Users = Get-ADUser `
-SearchBase $DN `
-Filter * `
-Properties $Properties
$ProgressCount = 0
foreach ($User in $Users) {
$ProgressCount++
if ($Users.Count -gt 0) {
Write-Progress `
-Activity "Получение пользователей Active Directory" `
-Status "$ProgressCount из $($Users.Count)" `
-PercentComplete (($ProgressCount / $Users.Count) * 100)
}
$ManagerName = $null
if ($User.Manager) {
$ManagerName = (
Get-ADUser $User.Manager `
-Properties DisplayName `
-ErrorAction SilentlyContinue
).DisplayName
}
$ReportLine = [PSCustomObject]@{
"First name" = $User.GivenName
"Last name" = $User.Surname
"Display name" = $User.DisplayName
"User logon name" = $User.SamAccountName
"User principal name" = $User.UserPrincipalName
"Street" = $User.StreetAddress
"City" = $User.City
"State/province" = $User.State
"Zip/Postal Code" = $User.PostalCode
"Country/region" = $User.Country
"Job Title" = $User.Title
"Department" = $User.Department
"Company" = $User.Company
"Manager" = $ManagerName
"OU" = Get-OUFromDistinguishedName $User.DistinguishedName
"Description" = $User.Description
"Office" = $User.Office
"Telephone number" = $User.telephoneNumber
"Other Telephone" = if ($User.otherTelephone) {
$User.otherTelephone -join ";"
} else {
$null
}
"E-mail" = $User.Mail
"Mobile" = $User.mobile
"Pager" = $User.pager
"Notes" = $User.info
"Account status" = if ($User.Enabled) {
"Enabled"
} else {
"Disabled"
}
"User created date" = $User.WhenCreated
"Last logon date" = $User.LastLogonDate
}
$Report.Add($ReportLine)
}
}
Write-Progress -Activity "Получение пользователей Active Directory" -Completed
$Report |
Sort-Object "Display name" |
Export-Csv -Path $CsvFile -NoTypeInformation -Encoding UTF8
Write-Host "Отчёт сохранён: $CsvFile"
Как указать OU для экспорта пользователей
В начале скрипта находится массив $DNs:
$DNs = @(
"OU=Sales,OU=Users,OU=Company,DC=exoip,DC=local",
"OU=IT,OU=Users,OU=Company,DC=exoip,DC=local",
"OU=Finance,OU=Users,OU=Company,DC=exoip,DC=local"
)
Замените значения из примера на Distinguished Name организационных единиц вашего домена.
Можно указать только одну OU:
$DNs = @(
"OU=Users,OU=Company,DC=exoip,DC=local"
)
Или несколько OU:
$DNs = @(
"OU=Sales,OU=Users,OU=Company,DC=exoip,DC=local",
"OU=IT,OU=Users,OU=Company,DC=exoip,DC=local",
"OU=Finance,OU=Users,OU=Company,DC=exoip,DC=local"
)
Как узнать Distinguished Name организационной единицы
Чтобы получить Distinguished Name нужной OU через графический интерфейс:
- Откройте Active Directory Users and Computers.
- В меню View включите Advanced Features.
- Найдите нужную организационную единицу.
- Щёлкните по ней правой кнопкой мыши и выберите Properties.
- Откройте вкладку Attribute Editor.
- Найдите атрибут distinguishedName.
- Скопируйте его значение.
Получаем Distinguished Name через PowerShell
Есть и более быстрый способ — получить список организационных единиц через PowerShell:
Get-ADOrganizationalUnit -Filter * |
Select-Object Name,DistinguishedName |
Sort-Object Name
После этого скопируйте значение DistinguishedName нужной OU в массив $DNs.
Как экспортировать всех пользователей домена
Если нужен отчёт не по отдельным OU, а по всему домену, можно использовать корень домена в качестве SearchBase.
Узнать его можно автоматически:
(Get-ADDomain).DistinguishedName
Например, для домена exoip.local результат будет:
DC=exoip,DC=local
Тогда массив можно задать так:
$DNs = @(
"DC=exoip,DC=local"
)
Запускаем экспорт пользователей Active Directory
Откройте PowerShell под учётной записью, имеющей права на чтение необходимых объектов Active Directory.
Перейдите в каталог со скриптом:
cd C:\scripts
Запустите:
.\Export-ADUsers.ps1
Во время работы скрипта PowerShell будет отображать прогресс обработки пользователей.
После завершения появится сообщение с расположением созданного CSV-файла:
Отчёт сохранён: C:\scripts\AllADUsers_20251007-1430.csv
Открываем CSV-файл с пользователями
После выполнения скрипта перейдите в:
C:\scripts
Там появится файл с именем вида:
AllADUsers_20251007-1430.csv
Откройте CSV-файл в Microsoft Excel или другом приложении для работы с таблицами.
Теперь данные можно фильтровать и проверять. Например, найти пользователей:
- без номера мобильного телефона;
- без должности;
- без отдела;
- без адреса электронной почты;
- без назначенного руководителя;
- с отключённой учётной записью;
- с давно отсутствующей активностью.
Что нужно знать о LastLogonDate
В отчёт добавлено свойство LastLogonDate. Оно удобно для общего аудита активности пользователей, но важно понимать его назначение.
LastLogonDate основано на реплицируемом атрибуте Active Directory и не предназначено для определения точного времени последнего входа пользователя вплоть до минуты.
Часто задаваемые вопросы
Как экспортировать пользователей Active Directory в CSV?
Используйте командлет Get-ADUser для получения пользователей и Export-Csv для сохранения результата. В приведённом скрипте дополнительно формируется удобный отчёт с контактными данными, OU, руководителем и состоянием учётной записи.
Нужно ли запускать скрипт на контроллере домена?
Нет. Скрипт можно запустить с другого компьютера, если на нём установлен модуль ActiveDirectory, есть сетевой доступ к домену и используемая учётная запись имеет необходимые права.
Как экспортировать пользователей только из одной OU?
Укажите Distinguished Name нужной организационной единицы в массиве $DNs. Например: OU=IT,OU=Users,OU=Company,DC=exoip,DC=local.
Как экспортировать пользователей сразу из нескольких OU?
Добавьте несколько Distinguished Name в массив $DNs. Скрипт последовательно обработает каждую указанную организационную единицу и сформирует общий CSV-файл.
Как экспортировать всех пользователей домена?
В качестве SearchBase укажите Distinguished Name корня домена. Его можно получить командой (Get-ADDomain).DistinguishedName.
Почему в CSV неправильно отображаются столбцы в Excel?
Это может быть связано с региональными настройками Windows и используемым разделителем CSV. В такой ситуации можно изменить параметр -Delimiter команды Export-Csv, например использовать точку с запятой.
Можно ли считать CSV-файл резервной копией пользователей Active Directory?
Нет. CSV подходит для отчётности, аудита и последующей обработки данных, но не является полноценной резервной копией объектов Active Directory.
Насколько точное значение LastLogonDate?
LastLogonDate удобно для общего анализа активности пользователей, но оно не предназначено для определения абсолютно точного времени последнего входа. Для точного аудита необходимо проверять lastLogon на контроллерах домена.
Заключение
С помощью PowerShell можно быстро сформировать подробный CSV-отчёт по пользователям Active Directory. В нашем варианте в него попадают основные данные учётной записи, контактная информация, должность, отдел, руководитель, OU, состояние учётной записи, дата создания и информация о последнем входе.
Скрипт можно использовать как основу для собственного аудита AD: убрать ненужные поля, добавить дополнительные атрибуты или ограничить экспорт определёнными организационными единицами.
Если необходимо выполнить обратную задачу и массово создать учётные записи, смотрите инструкцию Как импортировать пользователей AD из CSV с помощью PowerShell.