Powershell管道参数未传递给Set-ADUser

时间:2018-07-05 16:04:19

标签: powershell active-directory

在过去的几个小时中,我一直在撞墙,我敢肯定这是因为我对@ {}和$ _的工作方式不太了解。

首先输入代码:

Get-ADUser username -Properties mail | Set-ADUser -replace @{"proxyaddresses"="SMTP:"+$_.mail}

如您所见,我正在尝试使用用户的电子邮件地址更新proxyaddresses字段。

取而代之的是仅拉出字符串:(输出:proxyaddresses : {SMTP:})而忽略了管道,我认为这是因为出于某种原因它为空,但是我不清楚为什么。

我尝试了诸如"proxyaddresses="SMTP:$($_.mail)"之类的变体,我尝试使用总是与Get-ADUser一起发送的默认属性,例如UserPrincipalName

我知道由于这种http://www.itprotoday.com/management-mobility/more-flexible-active-directory-one-liner以及使用链接示例的一些变化而在SO上有多种答案,这样的事情是可能的。

当我将变量分配给SMTP:$_.mail并在字段中使用它时,就像这样:

Get-ADUser username -Properties mail | %{ $smtp = "SMTP:"+$_.mail 
$_|Set-ADUser -replace @{"proxyAddresses"=$smtp}

这有效(输出:proxyaddresses :{SMTP:emailaddress@domain.com})。如果我这样忽略字符串:@{"proxyaddresses"=$_.mail}

我收到以下错误:

  

Set-ADUser:无法将参数“替换”绑定到目标。异常设置“替换”:“对象引用未设置为对象的实例。”

     

在第1行:char:58

我不确定这是什么意思。

我希望我的最初想法可以有所变化,但是如果没有其他方法,我将使用一个额外的变量来解决该变通办法。

编辑:我的要求似乎有些困惑,所以我要澄清一下:

是否有一种方法可以在哈希表中不使用脚本块的情况下使用管道变量$_(在脚本块内部,他的第一个答案中建议使用类似@TheIncorrigible1的双管道)?

编辑:基于this,看来这应该没有任何问题。

3 个答案:

答案 0 :(得分:0)

您需要使用ForEach-Object来尝试访问管道,否则它不知道管道对象($_)是什么:

Get-ADUser -Identity username -Properties mail |
    ForEach-Object {
        $_ | Set-ADUser -Replace @{ 'proxyaddresses' = 'SMTP:' + $_.mail }
    }

-PipelineVariable公用参数,该公用参数明确将$_分配给变量:

Get-ADUser -Identity username -Properties mail -PipelineVariable user |
    Set-ADUser -Replace @{ ProxyAddresses = "SMTP:$($user.mail)" }

答案 1 :(得分:0)

ProxyAddresses是一个数组,其中“主要电子邮件地址”设置为SMTP:primary@example.com,但那里也可能会有其他元素,例如别名电子邮件地址(具有小写的smtp:前缀),SIP:地址等

从不尝试用用户对象的mail属性中找到的单个字符串简单地覆盖已经存在的内容,然后将其与要添加的内容合并。选择性地替换您要更改的地址,并构建一个有效地址数组。

基本上可以做到

$oldErrorAction = $ErrorActionPreference
$ErrorActionPreference = 'Stop'

$user = Get-AdUser -Identity $SAMAccountName -Properties mail
$primaryEmailAddress = $user.mail
$externalAddress = "smtp:<WHATEVER ALIAS YOU WOULD LIKE FOR THE USER">

$mailProxies = @("SMTP:$primaryEmailAddress", "smtp:$externalAddress")
# add more to this array if need be
$newProxies = @{'ProxyAddresses' = $mailProxies}

try {
    $user | Set-ADUser -Clear ProxyAddresses
    $user | Set-ADUser -Add $newProxies
}
catch {
    Write-Warning "Could not set ProxyAddresses: $($_.Exception.Message)"
}

$ErrorActionPreference = $oldErrorAction

答案 2 :(得分:0)

您可能想先设置变量,然后在脚本中调用它。

类似的东西

$ user = Get-ADUser用户名-Properties邮件|选择对象邮件

然后编写您的脚本并调用您可能需要使用带有if语句的foreach变量,以使其按您希望的方式运行。

相关问题