Как выгрузить список пользователей из active directory
Перейти к содержимому

Как выгрузить список пользователей из active directory

  • автор:

Аудит пользователей AD с помощью Powershell

Домен Active Directory может содержать в себе сотни и даже тысячи учетных записей и для управления всеми этими аккаунтами администратору требуется значительное количество времени. Даже, если у нас уже все аккаунты разнесены по группам, ко всем группам применены политики и настроены права доступа, все равно могут возникнуть ситуации, когда по тем или иным причинам нам необходимо найти полную информацию о пользователе.

Для решения этих задач нам может помочь PowerShell, инструмент, который помимо прочего, позволяет легко проводить аудит учетных записей пользователей Active Directory. Для этих целей мы будем использовать один из самых популярных командлетов Active Directory PowerShell — Get-ADUser. С помощью этого командлета мы можем получить как указанный пользовательский объект, так и выполнить настраиваемый поиск для получения нескольких пользовательских объектов.

У вас есть несколько вариантов того, как идентифицировать пользователя: можно использовать Distinguished Name (DN), Globally Unified Identifier (GUID), идентификатор безопасности (SID) или имя учетной записи Security Account Manager (SAM). О том, как можно использовать эти варианты на практике мы поговорим чуть дальше, а пока нам надо подготовить нашу инфраструктуру PowerShell для работы с Active Directory.

Для начала работы с AD нам необходимо установить модуль Active Directory. Сделать это можно двумя способами. Прежде всего, можно установить Remote Server Administration Tools (RSAT). Сделать это можно следующим образом: нажать Start, далее Settings, затем выбрать Apps и Optional Features, после этого добавить компонент с помощью Add и в открывшемся списке выбрать RSAT: Active Directory Domain Services and Lightweight Directory Services Tools option. Для завершения установки нажать Install.

Второй способ установки RSAT еще проще. Мы можем воспользоваться функционалом самого PowerShell для установки непосредственно с узла Windows Update.

Add-WindowsCapability –online –Name «Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0»

Приступим к поискам

Для поиска данных о пользователях в AD мы будем использовать параметр -Identity. Откроем модуль Active Directory Module for Windows Powershell в режиме Администратора.

Для начала поищем пользователя по его атрибуту sAMAccountName

В результате выполнения команды мы получили значения основных полей из AD для данного пользователя. Но мы можем также поискать пользователя по другим параметрам. Например, предположим, что нам известно только значение поля objectGUID (или GUID). В таком случае команда будет иметь следующий вид:

Еще один довольно распространенный случай, когда нам известно только значение SID и необходимо узнать, кто скрывается под этим значением. В таком случае мы также используем GetADUser с указанием SID:

Когда объектов слишком много

Представленная выше команда Get-ADUser удобна при работе в небольших средах, благодаря простоте использования. Но если в вашем домене десятки тысяч объектов, то Get-ADUser может создать заметную нагрузку на домен контроллер, с которым вы взаимодействуете при выполнении данного командлета. Дело в том, что Get-ADUser извлекает все пользовательские объекты в вашем подключенном домене AD.

Чтобы избежать подобной ситуации нам необходимо отфильтровать всю базу пользователей и выполнить поиск конкретных пользователей на основе некоторых свойств. Для решения этой задачи предназначен параметр ‘-filter’, указывающий строку запроса, которая извлекает объекты AD. В этой строке используется синтаксис PowerShell Expression Language (EL). Синтаксис PEL обеспечивает расширенную поддержку преобразования типов для типов значений, получаемых параметром Filter. Синтаксис использует представление по порядку, что означает, что оператор помещается между операндом и значением. Давайте рассмотрим несколько примеров, чтобы получить лучшее представление.

Для начала поищем все аккаунты, которые имеют статус Enabled:

Здесь после параметра filter мы в фигурных скобках указываем то логическое выражение, по которому должна осуществляться фильтрация. В данном случае мы получим все активные аккаунты в домене. Если мы к примеру, хотели бы получить список всех пользователей, у которых заполнено поле E-Mail, наш запрос имел бы следующий вид:

Get-ADUser -Filter -Properties Name,GivenName,mail| ft Name,GivenName,mail

Результаты работы команды мы передаем на вход команде ft (Format Table) которая переводит вывод в более читаемый вид.

Таким образом, вы можете использовать -Filter для поиска по другим полям объектов Active Directory.

Еще один пример — это поиск конкретного пользователя по заданному шаблону. Здесь мы найдем все записи, где вхождение такого шаблона используется в имени или фамилии пользователя.

Get-ADUser -Filter -Properties * | ft Name,EmailAddress

Давайте еще сократим нагрузку на нашу инфраструктуру AD ограничив поиск только по определенным Organizational Unit (OU). Для этого воспользуемся параметром -SearchBase.

Get-ADUser -SearchBase ‘OU=»Test Users»,DC=domain,DC=local’ -filter * -Properties Name,EmailAddress | ft Name,EmailAddress

В этом примере мы выводим имена и почтовые адреса пользователей, ограничивая область действия запроса только OU “Test Users”.

По умолчанию GetADUser возвращает десять основных полей, которые мы уже видели ранее, однако мы можем изменить вывод этой команды, указав с помощью ключа Properties те поля, которые нас интересуют. Например, если нам необходимо узнать, когда пользователи в последний раз меняли свои пароли, то это можно сделать с помощью следующей команды:

Get-ADUser -filter * -Properties Name,PasswordLastSet | ft Name,PasswordLastSet

Еще один полезный пример использования -Properties это получение списка пользователей со временем создания их аккаунтов.

Get-ADUser -filter * -Properties Name,whencreated | ft Name,WhenCreated

Заключение

В этой статье мы рассмотрели полезные на практике примеры работы с Active Directory с помощью PowerShell. В следующей статье мы поговорим о том, как PowerShell может помочь при анализе журналов событий.

Также хочу пригласить вас на бесплатный урок: «Написание скриптов на PowerShell и их использование», который пройдет уже в понедельник.

  • windows
  • powershell
  • active directory

Как экспортировать с AD всех пользователей вместе с группами и их OU?

Мне нужно с домена A вывести всех пользователей с сохранением групп и OU к которым подключены те самые пользователи и импортировать их к домену Б как лучшее всего это сделать? есть ли готовые скрипты?
Очень желательно сделать это скриптом домен А не имеет доступа в интернет

  • Вопрос задан более года назад
  • 2100 просмотров

Комментировать
Решения вопроса 1
shledon @shledon Автор вопроса

Вывел с помощью Get всех пользователей с определённого OU после из группы, теперь можно импортировать через New-aduser и ADGroupMember

get-aduser -filter * -searcbase "ou=?,dc=?,dc=?" | export-csv -path C:\desktop\? Get-ADGroupMember -identify . group. | export-csv -path C:\desktop\?

Ответ написан более года назад
Комментировать
Нравится Комментировать
Ответы на вопрос 2
системный инженер

Описание задачи намекает на миграцию пользователей между доменами, соответственно, на использование ADMT (с переносом прав, SID History, членства в группах, компьютеров, трансляции локальных профилей и т.д.)

Если всего этого не надо, то можно скриптом перенести, по сути — пересоздать старую структуру в новом домене (естественно, с новыми distinguishedname и objectSID):
— экспорт/импорт OU
— экспорт/импорт групп
— экспорт/импорт пользователей

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

В работе администратора домена встречаются задачи, когда нужно проанализировать какой-то лог, в котором указаны аккаунты пользователей или даже их 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 -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 | ` Export-Csv $OutFile -Delimiter "`t" -Encoding UTF8 -NoClobber -NoTypeInformation Write-Host Write-Host "The result is in $OutFile file."

В результате работы скрипта получается файл Дата_UsersList.csv, который лежит на рабочем столе пользователя, который запускал скрипт.

Скрипты выгрузки всех пользователей из MS Active Directory (ITGC)

Одной из стандартных процедур проведения аудита ITGC для каталога Active Directory является получение выгрузки всех пользователей домена. На основании полученных данных далее формируются процедуры тестирования, к примеру изучение списка администраторов или выявление пользователей с истекшим паролем. Наиболее эффективным для формирования такой выгрузки будет использование стандартного интерфейса PowerShell , примеры которого мы и рассмотрим в данной статье

1. Экспресс выгрузка скриптом на PowerShell

Ниже представлен скрипт PowerShell, как один из наиболее простых и быстрых способов получить список всех пользователей домена AD в формате CSV, который без проблем открывается тем же Excel’ем.

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = «LDAP://ou=Users,ou=Departmets,dc=test,dc=ru» $objSearcher.Filter = «(&(objectCategory=person)(!userAccountControl:1.2.840.113556.1.4.803:=2))» $users = $objSearcher.FindAll() # Количество учетных записей $users.Count $users | ForEach-Object < $user = $_.Properties New-Object PsObject -Property @< Должность = [string]$user.description Отдел = [string]$user.department Логин = [string]$user.userprincipalname Телефон = [string]$user.telephonenumber Комната = [string]$user.physicaldeliveryofficename ФИО = [string]$user.cn >> | Export-Csv -NoClobber -Encoding utf8 -Path С: list_domen_users.csv

Для того что бы скрипт отработал на вашей системе, необходимо его чуть подкорректировать, а именно вписать необходимые параметры, т.е. как в данном примере это параметры Users в подразделении Departments в домене Test.ru. А так же указать путь к месту сохранения файла list_domen_users.csv

После выгрузки, если сразу открыть list_domen_users.csv , будет выглядеть в не читабельном виде, однако, станалртыми средствами мы легко его приведем в нужный нам формат. Открываем в Excel list_domen_users.csv , выделяем первый столбец , затем заходим во вкладку «Данные» и нажимаем «Текст по столбцам». Выбираем «с разделителями» и нажимаем «Далее». Готово!

!Необходимо заметить , что данный скрипт не отобразит более 1000 пользователей. Для небольшой компании вполне подойдет, а тем же у кого в домене огромное количество пользователей стоит прибегнуть к методам описанным ниже.

2. Продвинутый командлет PowerShell для получения выгрузки пользователей Active Directory
Инструмент

К примеру, нас интересует информация о дате смены пароля и времени, когда он истечет . Результат выполнения команды можно выгрузить в текстовый файл:

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires > C:tempusers.txt

Или сразу выгрузить в CSV , который в дальнейшем будет удобно экспортировать в Excel (дополнительно с помощью sort-object отсортируем таблицу по столбцу PasswordLastSet , а также добавим условие where – имя пользователя должно содержать строку «Dmitry»)

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | where | sort-object PasswordLastSet | select-object Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires | Export-csv -path c:tempuser-password-expires-2015.csv


Далее приведем еще несколько полезных вариантов запросов о пользователях Active Directory:
Чтобы подсчитать общее количество всех аккаунтов в Active Directory :
Get-ADUser -Filter | Measure-Object
Список всех активных (не заблокированных) учетных записей в AD :
Get-ADUser -Filter | Select-Object SamAccountName,Name,Surname,GivenName | Format-Table
Список учетных записей с истекшим сроком действия пароля:
Get-ADUser -filter -properties passwordExpired | where
Пользователи, которые не меняли свой пароль в течении последних 90 дней:
$90_Days = (Get-Date).adddays(-90)
Get-ADUser -filter <(passwordlastset -le $90_days)>

Выше приведенные примеры безусловно не исчерпывают всех возможностей предоставляемых PowerShell. Для тех, кому тема показалась интересной может самостоятельно более подробно ознакомится с другими фичами в статьях Типовые задачи администрирования AD и 10 задач администрирования Active Directory опубликованной на Хабре.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *