Ответы Габриэля Люси и Матиаса Р. Джессена дают полезные советы по "нечеткой" фильтрации пользователей AD . [1]
Однако ваша основная проблема заключается в том, что ваш ForEach-Object
вызов не получает конвейерный вход , поскольку вы не подключили его к выходу из вызова Import-Csv
.
Во-вторых, ваш -Filter
аргумент { Name -like "'$($_.name)'"}
по ошибке применяется два слоя цитирования и пропущены символы подстановки , учитывая, что -like
сравнивается с полем всего поля , но вы хотите substring match.
Поскольку лучше избегать использования блоков скриптов ({ ... }
) в качестве -Filter
аргументов , используйте string :
"Name -like `"*$($_.name)*`"" # Note the enclosing '*' to match substrings
Обратите внимание, что я использовал встроенное цитирование "
(экранировано как `"
) вместо '
, чтобы не сломать фильтрсимена, которые содержат '
, такие как O'Malley
.
Тем не менее, , если, как предполагает ваш вопрос, имена в ваших данных CSV не являются прямыми подстрокамиДля свойств AD пользователей .Name
, указанного выше фильтра будет не , и даже техники ANR (разрешения неоднозначных имен), показанной в связанных ответах, может быть недостаточно.
В-третьих, ваш Export-Csv
вызов неуместен : поскольку он находится внутри блока сценария ForEach-Object
, один и тот же выходной файл перезаписывается на каждой итерации.
Необязательное чтение: ForEach-Object
поведение при не обеспечение конвейерного ввода :
Связанный блок сценария выполняется один раз .
$_
,Автоматическая переменная, которая содержит текущий входной объект, имеет вид $null
.
[1] Обратите внимание, что поисковый термин вфильтру LDAP может потребоваться экранирование ;согласно этой статье , символы * ( ) \ NUL
требуют экранирования и должны экранироваться как \<hh>
, где <hh>
- шестнадцатеричное представление ASCII-кода символа (например, *
должно бытьэкранируется как \2A
):
$escapedName = -join $(foreach ($c in [char[]] $_.name) { if ('*', '\', '(', ')', "`0" -contains $c) { '\' + ([int] $c).ToString('X2') } else { $c } })
Get-ADUser -LDAPFilter "(anr=$escapedName)"
С $_.name
, содержащим строку "James* (Jimmy) Smith\Smyth`0"
, $escapedName
будет преобразовываться в литерал James\2A \28Jimmy\29 Smith\5CSmyth\00