【问题标题】:Powershell Pipeline Argument not gettings passed to Set-ADUserPowershell 管道参数未传递给 Set-ADUser
【发布时间】:2018-07-06 04:10:00
【问题描述】:

在过去的几个小时里,我一直在用头撞墙,我确定这是因为我不太了解 @{} 和 $_ 的工作原理。

首先是代码:

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:无法将参数“替换”绑定到目标。异常设置“替换”:“对象引用未设置为对象的实例。”

在 line:1 char:58

我不确定这是什么意思。

我希望对我最初的想法进行一些变化,但如果没有其他方法,我会使用额外的变量来解决这个问题。

编辑:我的问题似乎有些混乱,所以我会澄清一下:

有没有办法使用管道变量$_,而无需在哈希表内使用脚本块(在脚本块内需要像他的第一个答案中建议的@TheIncorrigible1 那样的双管道。)?

编辑:基于this,这似乎不应该有任何问题。

【问题讨论】:

  • 顺便说一句,为了测试,我建议不要使用proxyaddresses 我在我的帐户上留下错误时学到了这一点,现在我无法在本地访问电子邮件,直到 DC 复制。 .. 您可以使用任何未使用的 extensionAttribute 或发明自己的测试属性并使用它。

标签: powershell active-directory


【解决方案1】:

您需要使用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)" }

【讨论】:

  • 谢谢,这个好像可行,你知道为什么我需要分配一个特殊的管道变量,而我不能只使用$_吗?
  • @YizBorol 我的猜测:没有foreach,如果没有脚本块{},管道就不会被枚举/变量分配。您可以使用脚本块执行隐式foreach:例如Get-ChildItem | Get-ChildItem -Path {$_.FullName},但必须显式调用参数。
  • -PipelineVariable 仍然无法解决问题。 (还是)感谢你的建议。我仍然只得到字符串的第一部分。
  • 尽管没有完全回答我的问题,但我选择将其标记为答案,因为它是最接近的,我认为问题是 powershell 如何使用管道变量处理哈希表的一些未记录的错误。跨度>
【解决方案2】:

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

【讨论】:

  • -Properties * 这是一种糟糕的做法,您没有回答 OP 关于管道是 $null 的问题。
  • @TheIncorrigible1:你是对的。在这种情况下,-Properties 邮件就足够了。
  • 感谢您的仔细警告,我想我应该补充一下,这是针对尚未设置代理地址的新用户,IT 内部对于谁负责此问题存在误解att 现在我们正试图返回并修复它,因为我们发现了问题,显然我们最好使用适当的脚本,但没有人有时间 :( 相反 FLS 已获得访问权限并正在修改在 ADUC 中手动操作,这真的很烦人,所以我想出了这个 powershell 线,它可以做得更快一点,它们还需要像其他三个属性一样修改。
  • 另外,为什么不直接使用-add?这会将新的 smtp 附加到旧的。
  • 当然,如果您可以确定要添加的新地址不在列表中,为什么不呢。我只是做-Clear 以确保我完全用我的新数组重新创建代理地址。在您的情况下,这与还没有任何内容的新用户有关,因此您可以跳过 -Clear。无论如何..你觉得你的问题现在已经回答了吗?
【解决方案3】:

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

类似的,

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

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

【讨论】:

  • 这个:$user = Get-ADUser username -Properties mail | Set-ADUser -replace @{"proxyaddresses"="SMTP:$($user.mail)"}
  • 你不在乎正确地编写命令。您将无法像那样在 -replace 中使用管道
  • 试试这个 $user = Get-ADUser username -Properties mail | select-object mail $replace = $user -replace @{"proxyaddresses"="SMTP:$($user.mail)"} 这可能不起作用,但您需要编写不同的命令
  • 你为什么使用选择对象?您对 Select-Object 的建议错误:Select-Object : A positional parameter cannot be found that accepts argument '$null'.
  • 您使用 select-object 的原因是指定您尝试更改或识别的属性。 Get-ADUser -Identity "username" -Properties mail,proxyaddresses | Select-Object mail,proxyaddresses..但是如果您尝试进行批量更改,您也应该使用 -searchbase 参数并一次执行一个 OU,但是您需要创建变量,然后在您的脚本中调用它们我会怎么做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多