在Get-AdUser中使用哈希表变量

时间:2014-10-20 14:25:12

标签: powershell

考虑以下代码片段

$User = @{Username = "fred.bloggs"}
$Username = $User.Username
Get-AdUser -Filter {SamAccountName -eq $Username}               # this works
Get-AdUser -Filter {SamAccountName -eq $User.Username}          # this throws an error

第一个Get-User可以使用,但第二个失败了:

  

Get-AdUser:属性:在类型为'System.Collections.Hashtable'的对象中找不到'用户名'。

我知道PowerShell使用对象和从左到右解析的解析怪癖,并且通常将它包装在$($ User.Username)中,但这也不起作用。

我知道答案很简单!

2 个答案:

答案 0 :(得分:2)

由于-Filter正在寻找System.String,您可以通过使用双引号而不是脚本块来解决解析问题:

Get-ADUser -Filter "SamAccountName -eq '$($User.Username)'"

Get-ADUser会将传递给-Filter的任何脚本块转换为字符串进行评估,因此首先使用字符串会很有帮助。

答案 1 :(得分:1)

可悲的是,我无法告诉你它失败的原因,但这可能是你的解决方法:

$filter = [scriptblock]::create("SamAccountName -eq $($User.Username)")
Get-AdUser -filter $filter

如果您发现您遇到的行为的原因,我会很高兴听到它:)

此致

更新

发生这种情况的可能原因是因为-Filter需要一个String,如果给出{}内的表达式,它会将其解释为高级过滤器,它不支持函数调用和类似的东西。 资料来源:MSDN(感谢Kohlbrr)