Как я могу привести атрибут AD в состояние фильтра при вызове Get-ADUser в PowerShell? - PullRequest
0 голосов
/ 13 октября 2018

Что я пытаюсь сделать:
Возвращать список пользователей AD, отфильтрованных по дате, сохраненной в атрибуте AD, с помощью PowerShell.

Проблема
Дата, по которой я хочу фильтровать, хранится в атрибуте AD со строковым типом данных, в частности extensionAttribute12.Это не подлежит обсуждению с людьми, для которых я пишу сценарий.

У меня проблемы с получением правильного синтаксиса в моем фильтре для приведения этой строки к дате до сравнения.

Вот мой нерабочий код:

Import-Module ActiveDirectory

$CurrentDate = Get-Date
$CurrentDate = $CurrentDate.ToString('MM-dd-yyyy')
$OU = "OU=PIV_Users,OU=FakeOU,DC=fake,DC=com"
$30Days = (Get-Date).AddDays(-30)

Get-ADUser -SearchBase $OU -SearchScope OneLevel -Filter {(extensionAttribute12 -notlike "*" -or extensionAttribute12 -le $30days) -and (enabled -eq $true) -and (whencreated -lt $30Days)} -Properties * |
    Select-Object Name, samAccountName, extensionAttribute12, whenCreated, enabled, employeeType

Это ошибка:

Get-ADUser: недопустимый тип 'Система.DateTime '.
Имя параметра: extensionAttribute12
В строке: 9 символов: 1

Я попытался добавить приведение следующим образом

... -or **[DateTime]extensionAttribute12** -le $30days) ...

, который дал мне этоошибка:

Get-ADUser: Ошибка разбора запроса: '(extensionAttribute12 -не похоже "*" -или [DateTime] extensionAttribute12 -le $ 30days) -and (enabled -eq $ true) -and (whencreated -lt $ 30Days) '
Сообщение об ошибке:' синтаксическая ошибка 'в позиции:' 40 '.
В строке: 9 символов: 1

1 Ответ

0 голосов
/ 13 октября 2018

Насколько мне известно, невозможно привести атрибуты к другому типу в строке поиска AD.Несмотря на обозначение в виде блока скрипта, аргумент параметра -Filter по сути является строкой запроса.

Что вы можете сделать, это выполнить фильтрацию через Where-Object после извлечения объектов.Это не оптимально (потому что ваш запрос AD будет возвращать больше объектов, чем нужно), но в этом случае я не вижу другого пути.Однако убедитесь, что вы перемещаете только те части фильтра на Where-Object, которые иначе не будут работать, поэтому Where-Object не нужно обрабатывать все пользовательских объектов.

Get-ADUser-Filter {extensionAttribute12 -notlike '*' -and enabled -eq $true -and whencreated -lt $30Days} ... |
    Where-Object { [DateTime]extensionAttribute12 -le $30days } |
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...