Подробный гайд по Get-ADUser: параметры -Filter и -Properties для администрирования AD
Командлет Get-ADUser из модуля ActiveDirectory — основной инструмент PowerShell для поиска и получения данных. Два параметра, определяющие что искать и какие данные вернуть: -Filter и -Properties.
Подготовка
1. Установите модуль Active Directory
- На контроллере домена: установлен по умолчанию
- На рабочей станции:
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0(Windows 10/11) или через RSAT
2. Импорт модуля
Import-Module ActiveDirectory
3. Права доступа
- Базовые атрибуты читаются любой учётной записью, прошедшей аутентификацию в домене
- Некоторые расширенные свойства (например,
msDS-UserPasswordExpiryTimeComputed) требуют правReadна объект или членства в группеPre-Windows 2000 Compatible Access
Параметр -Filter: синтаксис и операторы
-Filter выполняет серверную фильтрацию (на стороне контроллера домена). Это всегда быстрее, чем клиентская фильтрация через | Where-Object.
Рекомендуемый синтаксис
Get-ADUser -Filter { Условие }
Всегда используйте фигурные скобки
{}. Кавычки""или''приводят к проблемам с экранированием и разбором переменных.
Поддерживаемые операторы
| Оператор | Описание | Пример |
|---|---|---|
-eq |
Равно | {Department -eq "IT"} |
-ne |
Не равно | {Enabled -ne $true} |
-gt |
Больше | {PasswordLastSet -gt "01/01/2024"} |
-ge |
Больше или равно | |
-lt |
Меньше | |
-le |
Меньше или равно | |
-like |
Совпадение с * и ? |
{Surname -like "Иван*"} |
-notlike |
Отрицание like |
|
-and |
Логическое И | {Enabled -eq $true -and Department -eq "HR"} |
-or |
Логическое ИЛИ |
Что НЕ работает в -Filter
- `==`, `!=`, `>`, `<`, `&&`, `||` (это синтаксис PowerShell, а не AD-фильтра)
- Сложные выражения вроде `(A -eq B) -and (C -like D)` внутри вложенных скобок без явного `-and`/`-or`
- Регулярные выражения (`-match`, `~`)
Использование переменных
$dept = "Sales"
Get-ADUser -Filter {Department -eq $dept}
Переменные внутри
{}подставляются автоматически. Не оборачивайте их в кавычки.
Параметр -Properties: расширенные атрибуты
По умолчанию Get-ADUser возвращает только ~15 базовых свойств:
- DistinguishedName,
- Enabled,
- GivenName,
- Name,
- ObjectClass,
- ObjectGUID,
- SamAccountName,
- SID,
- Surname,
- UserPrincipalName,
- PasswordLastSet,
- PasswordExpired,
- AccountExpirationDate,
- LastLogonDate,
- Modified
Все остальные атрибуты нужно явно запрашивать через -Properties.
Синтаксис
Get-ADUser -Filter {Enabled -eq $true} -Properties EmailAddress, Department, Title, Manager, LastLogonTimestamp
Популярные расширенные свойства
| Свойство | Описание |
|---|---|
EmailAddress |
Email пользователя |
Department |
Отдел |
Title |
Должность |
Manager |
DN руководителя |
OfficePhone, TelephoneNumber |
Телефон |
LastLogonDate |
Последний вход (реплицируется) |
LastLogonTimestamp |
Низкоточная реплицируемая дата |
PasswordLastSet, PasswordExpired |
Состояние пароля |
AccountLockoutTime, LockedOut |
Блокировка учётки |
msDS-UserPasswordExpiryTimeComputed |
Дата истечения пароля (требует прав) |
ExtensionAttribute1..15 |
Кастомные поля (Exchange/AD) |
Важные нюансы
-Properties *вернёт все атрибуты. Работает медленно, нагружает КД и сеть. Используйте только для отладки.-Propertiesпринимает массив строк:-Properties "Email","Phone"или-Properties @("Email","Phone")- Wildcard поддерживается (
-Properties *Mail*), но не рекомендуется в production-скриптах - Если свойство не указано в
-Properties, оно вернётся как$null, даже если существует в AD
Комбинирование -Filter и -Properties
Get-ADUser -Filter {Enabled -eq $true -and Department -eq "IT"} `
-Properties EmailAddress, Title, Manager, LastLogonDate |
Select-Object Name, SamAccountName, EmailAddress, Title, Manager, LastLogonDate |
Format-Table -AutoSize
Всегда используйте
Select-ObjectпослеGet-ADUser, чтобы оставить в выводе только нужные поля. Это упрощает дальнейшую обработку и экспорт.
Оптимизация производительности
| Практика | Почему |
|---|---|
Фильтруйте на сервере (-Filter) |
| Where-Object загружает все объекты на клиент и фильтрует локально |
Указывайте только нужные -Properties |
-Properties * увеличивает трафик и время отклика |
Избегайте Get-ADUser -Filter * без ограничений |
В крупных доменах это может занять минуты |
Используйте Select-Object -First N для тестов |
Ограничивает выборку до первых N объектов |
| Кэшируйте результаты при повторных запросах | $users = Get-ADUser ... вместо многократных вызовов |
Типичные ошибки и решения
| Ошибка | Причина | Решение |
|---|---|---|
Invalid filter syntax |
Использование ==, !=, кавычек вокруг значений, пробелы вокруг операторов |
Используйте {Property -eq "Value"} |
Свойство пустое ($null) |
Не указано в -Properties |
Добавьте имя свойства в -Properties |
Invalid enumeration context |
Слишком много результатов | Добавьте -ResultSetSize 1000 или ограничьте фильтр |
| Даты не сравниваются корректно | Неверный формат или использование LastLogon вместо LastLogonDate |
Используйте [datetime]"2024-01-01" или "MM/dd/yyyy", предпочитайте LastLogonDate |
Access denied при чтении свойств |
Недостаточно прав | Запустите от имени учётки с правами чтения, используйте -Server для конкретного КД |
Готовые сценарии
1. Заблокированные учётки с временем блокировки
Get-ADUser -Filter {LockedOut -eq $true} `
-Properties AccountLockoutTime, LastBadPasswordAttempt |
Select-Object Name, SamAccountName, AccountLockoutTime, LastBadPasswordAttempt
2. Пользователи без email в определённом отделе
Get-ADUser -Filter {Department -eq "HR" -and EmailAddress -notlike "*"} `
-Properties EmailAddress |
Select-Object Name, EmailAddress
3. Истечение пароля в ближайшие 7 дней
$limit = (Get-Date).AddDays(7)
Get-ADUser -Filter {Enabled -eq $true} `
-Properties PasswordLastSet, msDS-UserPasswordExpiryTimeComputed |
Where-Object { $_.msDS-UserPasswordExpiryTimeComputed -ne $null -and
[datetime]::FromFileTime($_.msDS-UserPasswordExpiryTimeComputed) -le $limit } |
Select-Object Name, @{N="Expiry";E={[datetime]::FromFileTime($_.msDS-UserPasswordExpiryTimeComputed)}}
4. Экспорт в CSV
Get-ADUser -Filter {Enabled -eq $true} `
-Properties EmailAddress, Department, Title, Manager, LastLogonDate |
Select-Object Name, SamAccountName, EmailAddress, Department, Title,
@{N="Manager";E={$_.Manager.Split(',')[0].Split('=')[1]}},
LastLogonDate |
Export-Csv -Path "C:\temp\users.csv" -NoTypeInformation -Encoding UTF8
5. Поиск по переменной с безопасным фильтром
$searchTerm = "Петр"
Get-ADUser -Filter {Name -like "*$searchTerm*" -or SamAccountName -like "*$searchTerm*"} `
-Properties EmailAddress, Department |
Select-Object Name, SamAccountName, EmailAddress, Department
Чек-лист перед запуском
- [ ] Фильтр в
{}, операторы-eq/-like/-and - [ ] Указаны только нужные
-Properties - [ ] Используется
Select-Objectдля очистки вывода - [ ] Тест на небольшом наборе (
-Filterс ограничением илиSelect-Object -First 5) - [ ] Экспорт/обработка через конвейер, а не в циклах
foreach