PowerShell: свойства Get-ADUser с помощью
Я пытаюсь извлечь отдельные наборы пользователей с помощью 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
Я надеялся, что некоторые из вас могли бы предложить лучшее решение этой головоломки.
3 ответа
Благодаря всей помощи, которую я получил здесь, я понял причину этого странного поведения, высоко ценится!
Оказывается, аргумент "-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'"
Я думаю, что это так же хорошо, как сейчас.
Я мог бы помочь вам с обходным путем.
Создайте текстовый файл в кодировке Unicode и вставьте название компании. Тогда используйте Get-Content
хранить название компании в переменной.
$companyName = Get-Content .\companyName-unicode.txt
Get-ADUser -Filter { company -eq $companyName }
Я проверил с китайским текстом (中國哲學書電子化計劃), и он работал на моем сервере.
Вы можете попробовать создать имена с помощью суррогатов кодовых точек:
Это не намного лучше, но, по крайней мере, позволяет вам содержать весь скрипт в исходном файле.