PowerShell:使用 åäö 取得 ADUser 屬性

PowerShell:使用 åäö 取得 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 "åäö"

實際上,只要“åäö”是 unicode 查詢,它也可以工作(感謝@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'"

我想這已經是目前為止最好的了。

答案2

我可能會幫助您找到解決方法。

建立 Unicode 編碼文字檔案並插入公司名稱。然後使用將Get-Content公司名稱儲存在變數中。

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

我用中文測試了它,它在我的伺服器上運行。

答案3

您可以嘗試透過程式碼點代理程式建立名稱:

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

這並沒有好多少,但至少它允許您將整個腳本包含在原始檔案中。

相關內容