Hashtable

时间:2015-04-22 14:29:37

标签: powershell

希望是一个PowerShell noob问题,但是如何访问脚本块中的当前管道对象,该脚本块也在哈希表中?

以下是我试图完整的事情:

Get-ADGroupMember "Group Name" | 
    Where {$_.objectClass -eq "user"} | 
    Get-ADUser -properties extensionAttribute1 | 
    Where {$_.extensionAttribute1 -ne ($_.UserPrincipalName -replace "@ADdomain.com", "@GAdomain.com")} | 
    Set-ADUser -replace @{extensionAttribute1=&{$_.UserPrincipalName -replace "@ADdomain.com", "@GAdomain.com"}}

除了最后一行之外,我已经完成了所有工作,其中应该从当前用户extensionAttribute1生成新的UserPrincipalName,替换域。运行此代码会导致错误:

+ Set-ADUser <<<<  -replace @{ExtensionAttribute1=&{$_.UserPrincipalName -replace "@ADdomain.com", "@GAdomain.com"}}
+ CategoryInfo          : InvalidOperation: (CN=Bar\, Fo...ADdomain,DC=com:ADUser) [Set-ADUser], ADInvalidOperationException
+ FullyQualifiedErrorId : replace,Microsoft.ActiveDirectory.Management.Commands.SetADUser

使用字符串替换脚本块中的代码可以正常工作(如下所示),因此它似乎对当前管道对象有某种访问问题。 $_在这种情况下不起作用吗?

Set-ADUser -replace @{extensionAttribute1=&{"foobar"}}

1 个答案:

答案 0 :(得分:0)

简短的回答似乎是在你的管道中使用foreach:

Get-ADGroupMember "Group Name" | 
    Where {$_.objectClass -eq "user"} | 
    Get-ADUser -properties extensionAttribute1 | 
    Where {$_.extensionAttribute1 -ne ($_.UserPrincipalName -replace "@ADdomain.com", "@GAdomain.com")} | 
    foreach-objct {Set-ADUser $_ -replace @{extensionAttribute1=&{$_.UserPrincipalName -replace "@ADdomain.com", "@GAdomain.com"}}}

至于为什么,我很确定这是因为Set-ADUser只接受一个对象,无论是一个ADUser还是一个ADUser集合。由于$_代表this,因此您使用它的方式导致Set-ADUser将$_视为您在管道中提供的一个对象 - 用户组(而不是每个用户)用户)。

注意:以下是推测!如果我错了请纠正我!

关于Set-ADUser采取一个或多个对象......这是我的猜测。如果您查看Set-ADUser的输入类型,则会提供NoneMicrosoft.ActiveDirectory.Management.ADUser的类型。但是正如您所看到的,您还可以传递ADUser个对象的集合,Set-ADUser也会接受它。根据我对该cmdlet的理解,当您调用它时,您可以对该集合中的所有对象运行相同的Set命令。例如,你可以像你提到的那样做(假设$ users包含管道中的所有东西):

$users | Set-ADUser -replace @{extensionAttribute1=&{"foobar"}}

我的猜测是,在引擎盖下,Set-ADUser接受$ users作为单个参数值(通过在代码中设置ValueFromPipeline attributetrue)并应用您提供给每个参数的参数其中的对象。由于集合的迭代发生在cmdlet的代码中(不再在PowerShell中,它是已编译的.Net代码),因此$_在表示每个对象方面没有用处。

我不确定为什么管道允许你以伪foreach方式运行Get-ADUser的机制,因为它们具有相同的输入类型(你以类似的方式调用它而不使用foreach)但是基于证据,我必须假设它在引擎盖下。如果有人有进一步的见解,我肯定很想知道。我可能完全偏离基地!