Получение SMTP-адреса для всех отображаемых имен в группе рассылки, когда в отображаемом имени есть специальный символ - PullRequest
0 голосов
/ 30 января 2020

Итак, я вернулся с дополнительными вопросами о получении SMTP-адресов группы рассылки для принятых отправителей, ModeratedBy и ManagedBy.

Итак, скрипт, который я получил, работает почти идеально. Тем не менее, когда я извлекаю список адресов SMTP из сообщений acceptme только от разработчиков, используя отображаемое имя, он работает, если в имени или дополнительных пробелах нет специального символа. Таким образом, формат отображаемого имени - «Last, First», и пока форматирование следует этому правилу, мы в порядке. Однако, если в фамилии есть пробел, например «Ma c Gruber, Steven» или «# IT-Dept», SMTP-адрес не захватывается.

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

Для справки скрипт приведен ниже.

$props = @(
    "DisplayName"
    "SamAccountName"
    "PrimarySmtpAddress"
    @{n='Accepted Senders';e= {($_.acceptmessagesonlyfromsendersormembers | Foreach-Object {
    (Get-AdUser -Filter "DisplayName -eq '$($_.Split('/')][-1])'" -Property ProxyAddresses |
        Select-Object -Expand ProxyAddresses | Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:'}) -join '; '}}
    "ModerationEnabled"
    @{N="ModeratedBy";E= {($_.ModeratedBy | ForEach-Object {
    (Get-AdUser -Filter "DisplayName -eq '$($_.Split("/")[-1])'" -Property ProxyAddresses |
        Select-Object -Expand ProxyAddresses | Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:'}) -join '; '}}
    @{Name="Internal Senders Only";E={$_.RequireSenderAuthenticationEnabled}}
    @{N="ManagedBy";E= {($_.ManagedBy | ForEach-Object {
    (Get-AdUser -Filter "DisplayName -eq '$($_.Split("/")[-1])'" -Property ProxyAddresses |
        Select-Object -Expand ProxyAddresses | Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:'}) -join '; '}}
        )
Get-DistributionGroup -ResultSize Unlimited | Select-Object $props -First 1000 | export-Csv x:\xxx.csv -NoTypeInformation

Любая помощь, как всегда, высоко ценится.

Райан

1 Ответ

1 голос
/ 30 января 2020

Хорошо, проблема в том, что ваш командлет выводит CanonicalName, которое является вычисляемым свойством, а не чем-то, что на самом деле хранится в AD. С небольшой помощью ответа JRV здесь у нас есть функция, которая преобразует CanonicalName в DistinguishedName. DN можно напрямую передать в Get-ADUser, что упрощает процесс. Во-первых, функция, слегка измененная для приятного приема по конвейеру:

Function Convert-CanonicalName{   
    Param(
            [Parameter(Mandatory, ValueFromPipeline)]
            [string[]]$CanonicalName
    )
BEGIN{
    Try{
        $NameTranslate = New-Object -ComObject NameTranslate
        [void]$NameTranslate.GetType().InvokeMember('Init', 'InvokeMethod', $NULL, $NameTranslate, @(3, 2))
    }
    Catch{
        Throw $_
    }
}
PROCESS{
    ForEach($User in $CanonicalName){
        Try{
            [void]$NameTranslate.GetType().InvokeMember('Set', 'InvokeMethod', $NULL, $NameTranslate, @(8,$User))
            $NameTranslate.GetType().InvokeMember('Get', 'InvokeMethod', $NULL, $NameTranslate, @(1))
        }
        Catch{
            Throw $_
        }
    }
}
}

Это позволяет нам направить что-то вроде 'MyDomain.Net/Users/Big Jimmy' в функцию и вернуть ей 'CN=Big Jimmy,OU=Users,DC=MyDomain,DC=Net' в конвейер.

Продолжая, давайте возьмем одно из ваших вычисленных свойств:

@{n='Accepted Senders';e= {($_.acceptmessagesonlyfromsendersormembers | Foreach-Object {
(Get-AdUser -Filter "DisplayName -eq '$($_.Split('/')][-1])'" -Property ProxyAddresses |
    Select-Object -Expand ProxyAddresses | Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:'}) -join '; '}}

Теперь нам на самом деле не нужно ForEach-Object l oop там. Все здесь будет принимать множество вещей, обрабатывать каждый элемент и передавать его по конвейеру соответствующим образом. Итак, я собираюсь отбросить это, и просто для простоты чтения я собираюсь поместить каждую часть конвейера в отдельную строку. Что мы сделаем, так это возьмем вывод CanonicalNames из $_.acceptmessagesonlyfromsendersormembers, передадим его в нашу новую функцию, которая преобразует их в DN, направят в Get-ADUser, развернут свойство, отфильтруют для SMTP, очистят строки и присоединят их .

@{n='Accepted Senders';e= {($_.acceptmessagesonlyfromsendersormembers | 
    Convert-CanonicalName |
    Get-AdUser -Property ProxyAddresses |
    Select-Object -Expand ProxyAddresses | 
    Where-Object {$_ -cmatch '^SMTP:'}) -replace '^SMTP:' -join '; '}}

Вы должны иметь возможность изменять другие элементы аналогично с теми же результатами. По общему признанию, у меня нет сервера Exchange для тестирования, но если вы получаете массив CN, то это должно сработать.

...