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 行的注释:

$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

它并没有好多少,但至少它允许你将整个脚本包含在源文件中。

相关内容