PowerShell:带有åäö的Get-ADUser属性


8

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

以下内容在交互式会话中非常有用,但是在脚本中执行时不返回任何数据:

$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

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


谢谢@RyanRies,很不幸,它似乎没有帮助。阅读我的编辑以获取更多信息。
Tanel Rebane 2015年

1
因此,我可以(不幸地)使用LDP.exe重现此行为,因此我们的问题可能比Powershell更深层次。
瑞安·里斯

使用-LdapFilter代替-Filter可以工作吗?示例:-LdapFilter“(company = $ Company)”
user2320464 2015年

@TessellatingHeckler,在“Gåäördet”上仍然没有比赛。
Tanel Rebane 2015年

@ user2320464,LdapFilter也没有匹配。
Tanel Rebane 2015年

Answers:


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 "åäö"

实际上,只要它是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 }

我用中文哲学书电子化计划进行了测试,并在我的服务器上运行了。


感谢@Daniel,该解决方法确实有效。但是,它很脏。让我们看看是否还有其他人也有一些意见。
Tanel Rebane 2015年

是的,我知道。我希望有人能正确回答您的祷告-呃-问题。:)
丹尼尔(Daniel)

@TessellatingHeckler,进行测试时,要尝试匹配哪些非ASCII字符?
Tanel Rebane 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.