PowerShell:使用 åäö 获取 ADUser 属性

Tan*_*ane 8 scripting powershell active-directory

我正在尝试使用 Get-ADUser 提取选定的用户集。用户属于名称包含非 ASCII 字符的公司,例如“Gåäördet”。不幸的是,我们必须使用 company 属性来完成这个任务,我们还需要它从脚本中工作。

以下在交互式会话中效果很好,但在脚本中执行时不返回任何数据:

$Company = "Gåäördet"
Get-ADUser -Filter "company -eq '$Company'"
Run Code Online (Sandbox Code Playgroud)

我找到了工作但不够可靠的解决方法(有选择错误对象的风险):

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

...或者...

# Work-around 2: 
$Company = "G...rdets" # Use regex for åäö
Get-ADUser -Filter * -Properties Company | ? Company -match "$Company"
Run Code Online (Sandbox Code Playgroud)

附加说明:字符编码可能不是这里的问题。正如评论中所建议的,我将其放在脚本中。阅读每个 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
Run Code Online (Sandbox Code Playgroud)

我希望你们中的一些人可以为这个难题提供更好的解决方案。

Tan*_*ane 6

感谢这里的所有帮助,我找到了这种奇怪行为的根源,非常感谢!

原来“-Filter”参数接受“åäö”与“aao”互换。这不是 PowerShell 所做的,而是更深入的堆栈(感谢 @RyanRies 对其进行调查)。这就是以下代码段有效的原因:

$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
Run Code Online (Sandbox Code Playgroud)

事实证明查询不区分大小写,所以这也有效:

$Company = "AaO"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
Run Code Online (Sandbox Code Playgroud)

实际上,“åäö” 也能工作,只要它是一个 unicode 查询(感谢 @Daniel):

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

最后,这给我们留下了两个选择:

  • 在您的查询中将“åäö”替换为“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'"
Run Code Online (Sandbox Code Playgroud)

我想这和现在一样好。