PowerShell: Thuộc tính Get-ADUser với åäö


8

Tôi đang cố gắng trích xuất các nhóm người dùng được chọn bằng Get-ADUser. Người dùng thuộc về các công ty có tên bao gồm các ký tự không phải ASCII, ví dụ: "Gåäördet". Thật không may, chúng tôi phải sử dụng tài sản của công ty cho nhiệm vụ này và chúng tôi cũng cần nó để làm việc từ một kịch bản.

Phần sau hoạt động tuyệt vời trong phiên tương tác nhưng không trả về dữ liệu khi được thực thi trong tập lệnh:

$Company = "Gåäördet"
Get-ADUser -Filter "company -eq '$Company'"

Cách giải quyết tôi đã tìm thấy công việc nhưng không đủ tin cậy (rủi ro khi chọn sai đối tượng):

# Work-around 1:
$Company = "Gaaordet" # Replace åäö with aao in the variable
Get-ADUser -Filter "company -eq '$Company'" # Matches the company "Gåäördet", but why?

...hoặc là...

# Work-around 2: 
$Company = "G...rdets" # Use regex for åäö
Get-ADUser -Filter * -Properties Company | ? Company -match "$Company"

Để biết thêm lưu ý: mã hóa ký tự có thể không phải là vấn đề ở đây. Như được đề xuất trong một bình luận, tôi đặt điều này trong một kịch bản. Đọc nhận xét cho mỗi dòng Get-ADUser:

$OutputEncoding = [Console]::OutputEncoding

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

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

Tôi đã hy vọng một số bạn có thể đưa ra một giải pháp tốt hơn cho câu hỏi hóc búa này.


Cảm ơn bạn @RyanRies, thật không may, nó dường như không giúp được gì. Đọc chỉnh sửa của tôi để biết thêm.
Tanel Rebane

1
Vì vậy, tôi có thể (không may) tái tạo hành vi này với LDP.exe, vì vậy vấn đề của chúng tôi có thể ở mức độ sâu hơn Powershell.
Ryan Ries

Thay vì -Filter sẽ sử dụng -LdapFilter hoạt động? Ví dụ: -LdapFilter "(công ty = $ Công ty)"
user2320464

@TessellatingHeckler, vẫn không có trận đấu nào trên "Gåäördet".
Tanel Rebane

@ user2320464, LdapFilter cũng không tạo ra kết quả khớp nào.
Tanel Rebane

Câu trả lời:


7

Nhờ tất cả sự giúp đỡ ở đây, tôi đã đi đến tận cùng của hành vi kỳ quặc này, rất cảm kích!

Hóa ra đối số "-Filter" chấp nhận "åäö" hoán đổi với "aao". Đây không phải là hoạt động của PowerShell mà là xuống ngăn xếp (cảm ơn @RyanRies vì ​​đã xem xét nó). Đó là lý do tại sao đoạn trích sau hoạt động:

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

Nó cũng chỉ ra truy vấn không phân biệt chữ hoa chữ thường, vì vậy điều này cũng hoạt động:

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

Trên thực tế, "åäö" hoạt động miễn là nó là một truy vấn unicode (cảm ơn @Daniel):

$Company = "$([char]0x00E4)$([char]0x00E5)$([char]0x00F6)" # "åäö"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

Cuối cùng, điều này cho chúng ta hai lựa chọn:

  • Thay thế "åäö" bằng "aao" trong các truy vấn của bạn. Đầu ra sẽ giống hệt với việc sử dụng "åäö".
  • Thay thế "åäö" bằng unicode (@ joel-coel, cảm ơn vì đã nâng niu), ví dụ: bằng một tập lệnh.

Tôi đã chọn đi với tùy chọn thứ hai và kết quả trông hơi giống thế này:

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'"

Tôi đoán đó là tốt như bây giờ.


2

Tôi có thể giúp bạn với một cách giải quyết.

Tạo tệp văn bản được mã hóa Unicode và chèn tên Công ty. Sau đó sử dụng Get-Contentđể lưu trữ tên công ty trong một biến.

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

Tôi đã thử nghiệm với văn bản tiếng Trung Quốc () và nó hoạt động trên máy chủ của tôi.


Cảm ơn @Daniel, cách giải quyết đó đã thực sự hiệu quả. Tuy nhiên, nó là bẩn nghiêm trọng. Chúng ta hãy xem nó nếu bất cứ ai khác có một số đầu vào quá.
Tanel Rebane

Vâng, tôi biết. Tôi hy vọng ai đó có câu trả lời thích đáng cho vấn đề cầu nguyện của bạn. :)
Daniel

@TessellatingHeckler, khi thực hiện các bài kiểm tra của bạn, những ký tự không phải ASCII nào bạn đang cố gắng khớp?
Tanel Rebane

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.