Обновление пользователя ProxyAddresses - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь обновить свойство учетной записи пользователя AD ProxyAddresses. Я прочитал много тем об этом и применил один из предложенных подходов ( этот ), но он не работает для меня. Почему? Я использую следующий фрагмент кода (это часть скрипта, обновляющая данные большего количества пользователей):

$ADUser = SearchADUser -Kogo "sAMAccountName -eq '$($WzorUser.sAMAccountName)'"
...
1.$ProxyOK = $false
2.$Proxies = $ADUser.ProxyAddresses
3.$Proxies | ForEach-Object {
4.  $_ = $_ -replace 'SMTP', 'smtp'
5.  if ($_ -match $NoweMail) {
6.      $_ = $_ -replace 'smtp', 'SMTP'
7.      $ProxyOK = $true
8.  }
9.}
10.if (!($ProxyOK)) { $Proxies += ("SMTP:$($NoweMail)") }
...
if (!([string]::IsNullOrEmpty($Proxies))) {
    $AttrToReplace.Add("ProxyAddresses", $Proxies)
Set-ADUser -Identity $ADUser.sAMAccountName -Server $ADDC @Attr #-PassThru -WhatIf

При циклическом выполнении прокси его элементы обрабатываются правильно: буквы для всех в нижнем и верхнем регистре, если новая почта уже присутствовал. Но Прокси не изменился. Нужно ли каждый элемент каким-либо образом сохранять или заменять в объекте?

Обновление 2020-04-02

Потому что усилия сторонника (@Theo еще раз спасибо за Ваша помощь) сосредоточиться на замене метода. Я пытаюсь более подробно объяснить мою проблему.

Целевые значения proxyAddresses пользователей (это редкий случай, когда женщины возвращаются к ее девичьей фамилии, записанной в AD):
SMTP : анна. nowak22@lp.pl
smtp : a. b@moc.com

Исходные значения (строка 2):

[DBG]: PS X:\>> $Proxies
smtp:anna.nowak22@lp.pl
SMTP:a.b@moc.com

Пока зацикливание на каждом элементе прокси (строка 9):

[DBG]: PS X:\>> $_
SMTP:anna.nowak22@lp.pl
[DBG]: PS X:\>> $Proxies
smtp:anna.nowak22@lp.pl
SMTP:a.b@moc.com

[DBG]: PS X:\>> $_
smtp:a.b@moc.com
[DBG]: PS X:\>> $Proxies
smtp:anna.nowak22@lp.pl
SMTP:a.b@moc.com

Как видно, $ Proxies не отражает изменений.

Если было только одно значение ProxyAddresses, не равное новой почте, новая почта была добавлена ​​как SMTP к существующей, которая также передается как SMTP (два основных ProxyAddresses).

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

$newProxies = $null
$Proxies | ForEach-Object {
    $_ = $_ -creplace 'SMTP', 'smtp'
    if ($_ -match $NoweMail) {
        $_ = $_ -creplace 'smtp', 'SMTP'
        $ProxyOK = $true
    }
      $newProxies.add($_)
}

Выше выдает ошибку

Yo Вы не можете вызвать метод для выражения с нулевым значением

$newProxies += $_ создает одну строку SMTP: anna. nowak22@lp.pl smtp: a. b@moc.com, которая добавляется как single ProxyAddress.

Как я уже отметил, $ Proxies - это особый объект AD, и я не знаю, как создать объект такого типа и как добавить в него новые элементы.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Как прокомментировано, здесь более читабельно в качестве ответа.

В своем коде вы добавляете модифицированный массив $Proxies в хеш-таблицу (я думаю) с именем $AttrToReplace. Однако в последней команде Set-ADUser вы не используете это, а вместо этого используете восклицательный знак с помощью переменной @Attr.

Чтобы обновить многозначный атрибут ProxyAddresses, измените код после трех точек в вашем вопросе из :

if (!([string]::IsNullOrEmpty($Proxies))) {
    $AttrToReplace.Add("ProxyAddresses", $Proxies)
Set-ADUser -Identity $ADUser.sAMAccountName -Server $ADDC @Attr #-PassThru -WhatIf

в:

# no need to test if $Proxies is an empty array, because 
# it will at the very least have "SMTP:$($NoweMail)"
Set-ADUser -Identity $ADUser.SamAccountName -Clear ProxyAddresses
Set-ADUser -Identity $ADUser.SamAccountName -Add @{proxyAddresses = $Proxies | ForEach-Object { "$_" }}

# or do this on one line:
# Set-ADUser -Identity $ADUser.SamAccountName -Replace @{proxyAddresses = $Proxies | ForEach-Object { "$_" }}


Обновление

Из ваших комментариев ваш код оставляет место для дубликатов прокси-адресов .

Вы можете получить этот список, заменить все существующие SMTP: на smtp: и добавить к нему новый основной адрес электронной почты следующим образом:

# get the current ProxyAddress values for this user, change all values 
# that begin with uppercase 'SMTP:' to lowercase 'smtp:'.
# skip any proxy that is equal to "smtp:$NoweMail", add the $NoweMail 
# preceeded by 'SMTP:' to the list and sort or select unique
$Proxies = @($ADUser.ProxyAddresses -replace '^SMTP:', 'smtp:' |
           Where-Object { $_ -ne "smtp:$NoweMail" }) + "SMTP:$NoweMail" | Sort-Object -Unique


# set the new proxy addresses in the user attribute
# no need to test if $Proxies is an empty array, because 
# it will at the very least have "SMTP:$($NoweMail)"
Set-ADUser -Identity $ADUser.SamAccountName -Clear ProxyAddresses
Set-ADUser -Identity $ADUser.SamAccountName -Add @{proxyAddresses = [string[]]$Proxies}

# or do this on one line:
# Set-ADUser -Identity $ADUser.SamAccountName -Replace @{proxyAddresses = [string[]]$Proxies}

Обратите внимание, что внутри ha sh для добавления или замены, используется имя LDAP, поэтому proxyAddresses со строчными буквами p

0 голосов
/ 08 апреля 2020

@ Тео. Ваше решение работает отлично. Спасибо за помощь. Я оставил свой подход (он мне подходит и работает) и немного изменил код.

$ProxyOK = $false
$Proxies = $null
$Proxies = @()
$ADUser.ProxyAddresses | ForEach-Object {
  $_ = $_ -creplace 'SMTP', 'smtp'
  if ($_ -match $NoweMail) {
      $_ = $_ -creplace 'smtp', 'SMTP'
      $ProxyOK = $true
  }
  $Proxies += $_
}
if (!($ProxyOK)) { $Proxies += ("SMTP:$($NoweMail)") }
...
if ($Proxies) {
    $AttrToReplace.Add("ProxyAddresses", [string[]]$Proxies)
}
if ($AttrToReplace.Count -gt 0) {
    $Attr.Add("Replace", $AttrToReplace)
}
Set-ADUser -Identity $ADUser.sAMAccountName -Server $ADDC @Attr #-PassThru -WhatIf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...