PowerShell: åäö를 사용한 Get-ADUser 속성

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-line에 대한 설명을 읽어보세요.

$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 "åäö"

실제로 "åäö"는 유니코드 쿼리인 경우에도 작동합니다(@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'"

지금으로서는 그 정도가 좋은 것 같아요.

답변2

해결 방법을 안내해 드릴 수 있습니다.

유니코드로 인코딩된 텍스트 파일을 만들고 회사 이름을 삽입합니다. 그런 다음 Get-Content회사 이름을 변수에 저장하는 데 사용합니다.

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

중국어 텍스트(中國哲school書計劃)로 테스트했는데 내 서버에서 작동했습니다.

답변3

코드 포인트 서로게이트를 통해 이름을 구축해 볼 수도 있습니다.

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

그다지 좋지는 않지만 최소한 소스 파일 내에 전체 스크립트를 포함할 수 있습니다.

관련 정보