Хорошо, проблема в том, что ваш командлет выводит 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, то это должно сработать.