Подробный гайд по Get-ADUser: параметры -Filter и -Properties для администрирования AD

Полное руководство по Get-ADUser: синтаксис фильтра -Filter, выбор свойств -Properties, оптимизация и готовые скрипты для администрирования AD.

2026.05.01                  


Подробный гайд по Get-ADUser: параметры -Filter и -Properties для администрирования ADПодробный гайд по 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