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에게 감사합니다. 불행히도 도움이되지 않는 것 같습니다. 자세한 내용은 내 편집을 읽으십시오.
Tanel Rebane

1
따라서 불행히도 LDP.exe를 사용하여이 동작을 재현 할 수 있으므로 문제가 Powershell보다 더 심할 수 있습니다.
Ryan Ries

-Filter 대신 -LdapFilter를 사용하면 작동합니까? 예 : -LdapFilter "(company = $ Company)"
user2320464 0:42에

@TessellatingHeckler, 아직 "Gåäördet"와 일치하는 항목이 없습니다.
Tanel Rebane

@ user2320464에서 LdapFilter는 일치하는 항목을 생성하지 않습니다.
Tanel Rebane

답변:


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"로 바꾸십시오. 출력은 "åäö"를 사용하는 것과 동일합니다.
  • 스크립트와 같이 "åäö"를 유니 코드 (@ 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 }

나는 중국어 텍스트 (中國 哲學 書 電子 化 計劃)로 테스트했으며 서버에서 작동했습니다.


감사합니다 @Daniel, 그 해결 방법이 실제로 작동했습니다. 그러나 심각합니다. 다른 사람도 입력 내용이 있으면 그것을 보자.
Tanel Rebane

그래, 알아 누군가기도에 대한 올바른 답을 얻길 바랍니다. :)
Daniel

@TessellatingHeckler, 테스트를 할 때 어떤 비 ASCII 문자를 일치 시키려고합니까?
Tanel Rebane

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.