PowerShell: свойства Get-ADUser с помощью


8

Я пытаюсь извлечь отдельные наборы пользователей с Get-ADUser. Пользователи принадлежат компаниям, имена которых включают символы не ASCII, например, "Gåäördet". К сожалению, нам нужно использовать свойство компании для этой задачи, а также нам нужно, чтобы оно работало из сценария.

Следующее прекрасно работает в интерактивном сеансе, но не возвращает данных при выполнении в скрипте:

$Company = "Gåäördet"
Get-ADUser -Filter "company -eq '$Company'"

Обходные пути, которые я нашел работу, но недостаточно надежны (рискует выбрать неправильные объекты):

# Work-around 1:
$Company = "Gaaordet" # Replace åäö with aao in the variable
Get-ADUser -Filter "company -eq '$Company'" # Matches the company "Gåäördet", but why?

...или...

# Work-around 2: 
$Company = "G...rdets" # Use regex for åäö
Get-ADUser -Filter * -Properties Company | ? Company -match "$Company"

Для дополнительного примечания: кодировка символов не может быть проблемой здесь. Как предложено в комментарии, я поместил это в сценарий. Прочитайте комментарий для каждой строки Get-ADUser:

$OutputEncoding = [Console]::OutputEncoding

$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

$Company = "åäö"
Get-ADUser -Filter "company -eq '$Company'" # No matches

Я надеялся, что некоторые из вас могли бы предложить лучшее решение этой головоломки.


Спасибо @RyanRies, к сожалению, это не помогло. Прочитайте мое редактирование для получения дополнительной информации.
Танель Ребане

1
Так что я могу (к сожалению) воспроизвести это поведение с LDP.exe, поэтому наша проблема может быть на более глубоком уровне, чем Powershell.
Райан Райс

Вместо -Filter будет работать -LdapFilter? Пример: -LdapFilter "(company = $ Company)"
user2320464

@TessellatingHeckler, по-прежнему нет совпадений на "Gåäördet".
Танель Ребане

@ user2320464, LdapFilter также не выдает совпадений.
Танель Ребане

Ответы:


7

Благодаря всей помощи, которую я получил здесь, я понял причину этого странного поведения, высоко ценится!

Оказывается, аргумент «-Filter» принимает «åäö» взаимозаменяемо с «aao». Это не PowerShell, а дальше в стеке (спасибо @RyanRies за внимание). Вот почему работает следующий фрагмент:

$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

Также оказывается, что запрос не чувствителен к регистру, так что это тоже работает:

$Company = "AaO"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

На самом деле, "åäö" работает слишком долго, пока это запрос в юникоде (спасибо @Daniel):

$Company = "$([char]0x00E4)$([char]0x00E5)$([char]0x00F6)" # "åäö"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

В итоге это оставляет нам два варианта:

  • Замените "åäö" на "aao" в ваших запросах. Вывод будет идентичен использованию «ääö».
  • Замените "åäö" на unicode (@ joel-coel, спасибо за толчок), например, сценарием.

Я выбрал второй вариант, и результат выглядит примерно так:

function UniReplace($n){
    [char][int]"0x$n"
}

$Company = "åäö"
$Company = $Company -Replace 'ä',"$(UniReplace E4)"
$Company = $Company -Replace 'Ä',"$(UniReplace C4)"
$Company = $Company -Replace 'å',"$(UniReplace E5)"
$Company = $Company -Replace 'Å',"$(UniReplace C5)"
$Company = $Company -Replace 'ö',"$(UniReplace F6)"
$Company = $Company -Replace 'Ö',"$(UniReplace D6)"

echo "This is the content of string `$Company: $Company"
Get-ADUser -Filter "company -eq '$Company'"

Я думаю, это так же хорошо, как и сейчас.


2

Я мог бы помочь вам с обходным путем.

Создайте текстовый файл в кодировке Unicode и вставьте название компании. Затем используйте Get-Contentдля сохранения названия компании в переменной.

$companyName = Get-Content .\companyName-unicode.txt
Get-ADUser -Filter { company -eq $companyName }

Я проверил с китайским текстом (中國 哲學 書 電子 化 計劃), и он работал на моем сервере.


Спасибо @Daniel, этот обходной путь действительно работал. Тем не менее, это серьезно грязно. Давайте посмотрим, есть ли у кого-то еще информация.
Танель Ребане

Да, я знаю. Я надеюсь, что кто-то получил правильный ответ на вашу молитвенную проблему. :)
Даниил

@TessellatingHeckler, когда вы выполняете тесты, с какими не-ASCII-символами вы пытаетесь сопоставить?
Танель Ребане

1

Вы можете попробовать создать имена с помощью суррогатов кодовых точек:

/programming/4834291/how-to-encode-32-bit-unicode-characters-in-a-powershell-string-literal

Это не намного лучше, но, по крайней мере, позволяет вам содержать весь скрипт в исходном файле.


это было очень полезно. Я делаю рецензию на проблему прямо сейчас.
Танель Ребане
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.