PowerShell: получите-ADUser Свойства с åäö

Я пытаюсь извлечь избранные группы пользователей с, Добираются-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-line:

$OutputEncoding = [Console]::OutputEncoding

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

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

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

8
задан 22 May 2015 в 19:10
3 ответа

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

Оказывается, аргумент "-Фильтр" принимает "äö" как взаимозаменяемое с "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" в ваших запросах. Вывод будет идентичен использованию "éäö".
  • Замените "éäö" на юникод (@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'"

Наверное, пока все так же хорошо.

.
7
ответ дан 2 December 2019 в 22:58

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

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

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

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

.
2
ответ дан 2 December 2019 в 22:58

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

https://stackoverflow.com/questions/4834291/how-to-encode-32-bit-unicode-characters-in-a-powershell-string-literal

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

.
1
ответ дан 2 December 2019 в 22:58

Теги

Похожие вопросы