PowerShell: Get-ADUser Properties с помощью åäö

PowerShell: Get-ADUser Properties с помощью åäö

Я пытаюсь извлечь выбранные наборы пользователей с помощью 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

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

решение1

Спасибо всем, кто оказал мне помощь, я разобрался в причинах этого странного поведения, очень признателен!

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

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

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

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

На самом деле, «åäö» тоже работает, если это запрос в формате Unicode (спасибо @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 }

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

решение3

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

https://stackoverflow.com/questions/4834291/как-кодировать-32-битные-символы-Unicode-в-строке-powershell-literal

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

Связанный контент