Аргумент конвейера Powershell не передается в Set-ADUser - PullRequest
0 голосов
/ 05 июля 2018

Последние несколько часов я бился головой о стену, я уверен, что это потому, что я не совсем понимаю, как работают @ {} и $ _.

Первый код:

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

Как вы видите, я пытаюсь обновить поля адресов прокси с помощью адреса электронной почты пользователя.

Вместо этого извлекается только строка: (вывод: 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 символ: 58

Я не уверен, что это значит.

Мне бы хотелось, чтобы сработала некоторая вариация моей первоначальной идеи, но я остановлюсь на обходном пути, используя дополнительную переменную, если другого пути нет.

РЕДАКТИРОВАТЬ: Кажется, есть некоторая путаница в том, что я спрашиваю, поэтому я уточню:

Есть ли способ использовать конвейерную переменную $_ без блока скрипта внутри хеш-таблицы (внутри блока скрипта требуется двойной конвейер, как @ TheIncorrigible1 , предложенный в его первом ответе.)

РЕДАКТИРОВАТЬ: На основе это кажется, что это не должно иметь никаких проблем.

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

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
0 голосов
/ 05 июля 2018

Вы можете сначала попытаться установить переменную, а затем вызвать ее в скрипте.

как то так,

$ user = Get-ADUser username -Properties mail | почта выбора объекта

Затем напишите свой скрипт и вызовите переменную, которая может понадобиться для использования foreach с оператором if, чтобы он функционировал так, как вы хотите.

0 голосов
/ 05 июля 2018

Вам нужно использовать 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)" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...