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)
我希望你们中的一些人可以为这个难题提供更好的解决方案。
感谢这里的所有帮助,我找到了这种奇怪行为的根源,非常感谢!
原来“-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)
最后,这给我们留下了两个选择:
我选择了第二个选项,结果看起来有点像这样:
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)
我想这和现在一样好。
归档时间: |
|
查看次数: |
5747 次 |
最近记录: |