Управление многопрофильными атрибутами AD (ProxyAddresses) - PullRequest
0 голосов
/ 10 октября 2018

У меня есть список пользователей с несколькими значениями в их атрибуте ProxyAddresses, например,

SMTP:JohnSmith@domain1.com
smtp:jsmith@domain2.com
smtp:ukCC10s@domain2.com
smtp:smith.john@domain3.com

и многими другими неизвестными.

Что я хочу сделать, это:

  1. Преобразовать все существующие адреса, начинающиеся с smtp / SMTP, в нижний регистр
  2. Добавить / заменить адрес, соответствующий SMTP: firstname.surname@Domain2.com (чтобы сделать его основным)

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

$userou = "OU=test2,OU=Test,OU=Users,DC=Corp,DC=Local"
$users = Get-ADUser -Filter * -SearchBase $userou -Properties SamAccountName, ProxyAddresses

foreach ($user in $users) {
    Get-ADUser $user | Set-ADUser -Replace @{'ProxyAddresses'="SMTP:blah@blah.com"}
} 

Как перечислить черезкаждое значение в многозначном атрибуте?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Код ниже должен делать то, что вам нужно.Он обновляет многозначное свойство ProxyAddresses, чтобы все адреса smtp / SMTP стали строчными, а новый основной адрес электронной почты вычислялся и вставлялся в список.

Я добавил небольшую вспомогательную функцию для замены диакритических символов, которые могутпоявляются в имени или фамилии пользователя, потому что Outlook 365 особенно плохо обрабатывает эти символы.

$userou = "OU=test2,OU=Test,OU=Users,DC=Corp,DC=Local"
$users  = Get-ADUser -Filter * -SearchBase $userou -Properties SamAccountName, ProxyAddresses, EmailAddress


function Replace-Diacritics {
    # helper function to replace characters in email addresses that especially Outlook365 does not like..
    Param(
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
        [string] $EmailAdress
    )
    $chars = @()
    $normalized = $EmailAdress.Normalize( [Text.NormalizationForm]::FormD )
    $normalized.ToCharArray() | ForEach-Object { 
        if( [Globalization.CharUnicodeInfo]::GetUnicodeCategory($_) -ne [Globalization.UnicodeCategory]::NonSpacingMark) {
            $chars += $_
        }
    }
    $chars -join ''
}

foreach ($user in $users) {
    # create the new primary emailaddress
    # remove invalid characters and replace diacritics ("Frédérique.Étrangér@Domain2.com" --> "frederique.etranger@domain2.com")
    $newPrimary = ($("{0}.{1}@Domain2.com" -f $user.GivenName, $user.Surname) -replace '[\s()<>,;:''"{}/[\]\\]+', '').ToLower()
    $newPrimary = "SMTP:" + (Replace-Diacritics ($newPrimary -replace '\.+', '.'))

    # get all email addresses and convert them to lowercase. At the same time dedupe this array.
    # this will also replace 'SMTP:' of the former Primary email address to become an alias ('smtp:')
    $emailAliases = @($user.ProxyAddresses | Where-Object { $_ -match '^smtp:.*' -and $_ -ne $newPrimary } | 
                                             ForEach-Object { $_.ToLower() } |
                                             Sort-Object -Unique)
    # read all other existing stuff
    $otherAddresses = @($user.ProxyAddresses | Where-Object { $_ -notmatch '^smtp:.*' })

    # now merge all addresses into one array, the Primary email address on top for easier reading in ADUC
    $newProxies = (@($newPrimary) + $emailAliases) + $otherAddresses

    # finally replace the users ProxyAddresses property. I like:
    $user | Set-ADUser -Clear ProxyAddresses
    $user | Set-ADUser -Add @{'proxyAddresses'=$newProxies }
    # but you could also do
    # $user | Set-ADUser -Replace @{'proxyAddresses' = $newProxies}

    # finally, put the new primary email address in the users 'mail' property
    $user | Set-ADUser -EmailAddress $($newPrimary -replace 'SMTP:', '')
} 
0 голосов
/ 10 октября 2018

Не проверено, потому что у меня здесь нет AD, но я ожидаю, что что-то подобное сработает, поскольку многозначные атрибуты должны быть возвращены как коллекции.

$addr = $user.ProxyAddresses -creplace '^SMTP:', 'smtp:'
$addr += 'SMTP:blah@blah.com'
$user | Set-ADUser -Replace @{ 'ProxyAddresses' = $addr }

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

$addr += $newPrimaryAddress[$user.SamAccountName]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...