We rise up for the things we believe in over and over again

Захотелось посмотреть, а у кого и куда стоит перенаправление почтовых писем в AD. И заодно подсчитать количество таких записей. Компоненты этого скрипта известны - get-qaduser, конвейеры, оператор вывода write-host. Основная сложность в том, что ключевой параметр altrecipient, в котором и хранится информация о цели перенаправления почты, в конвейер просто так не выводится, на выходе получаем пустые значения. Немного поковырявшись в справке по командлету get-qaduser находим ключ -IncludeAllProperties. Данный параметр заставляет команду get-qaduser выбрать из AD всю информацию о пользователе, по-умолчанию этого не происходит. Вторая сложность - по конвейеру нельзя передать конструкцию вида $_.altrecipient оператору write-host. Следовательно, приходится сначала упаковывать требуемые нам значения в переменные, а потом через write-host выводить на экран значения этих переменных. Одновременно в цикле можем подсчитать, сколько таких пользователей нашлось.
Суммируя всю эту информацию, скрипт принимает следующий вид:
get-qaduser -includeallproperties -oa @{altrecipient='*'} | %{$name = $_.name;$alt=$_.altrecipient;$i=$i+1;write-host $name" -> "$alt};write-host $i;$i=0

@музыка: Faun - Iduna

@темы: PowerShell, MS Exchange

Комментарии
28.07.2011 в 17:20

Слова "не надо нервничать" хорошо помогают привести человека в нормальное состояние бешенства.
Можно немного короче:
get-aduser -filter {altrecipient -like "*"} -Properties altrecipient | %{Write-host "$($_.name) -> $($_.altrecipient)"}
Отличия от твоего:
1. Используется стандартный набор командлетов для работы с AD присутствующий в Windows7/2008 R2. Правда для его работы на DC должен быть установлен Active directory web services (По умолчанию есть в 2008 R2 и идет отдельным пакетом для 2008 и 2003). Quest'овский Powerpack для работы с AD меня разочаровал когда я обнаружил что скрипт написаный для более ранней версии пака может не работать с более поздней из-за смнившихся форматов выдаваемых данных. Впрочем это легко переписать и под тот командлет что используешь ты. должно быть что-то вроде
get-qaduser -includeallproperties -oa @{altrecipient='*'} | %{Write-host "$($_.name) -> $($_.altrecipient)"}

2. Как видишь я не использую промежуточные переменные. Вместо этого у меня конструкции вида $(exprеssion), которые замечательно парсятся будучи заключенными в двойные кавычки.
Кстати Write-Host не обязателен: вариант
get-aduser -filter {altrecipient -like "*"} -Properties altrecipient | %{"$($_.name) -> $($_.altrecipient)"}
Еще короче и тоже будет работать

3. Я включаю не все свойства а только необходимое мне altrecipient. С get-qaduser Это выглядело бы так:
get-qaduser -IncludedProperties altrecipient -oa @{altrecipient='*'}
Если работаешь с большим количеством записей это здорово экономит память и увеличивает скорость обработки.

Хорошего дня, коллега :)
28.07.2011 в 18:08

We rise up for the things we believe in over and over again
Спасибо за комментарий :)
Я подозревал, что это дело можно как-то упростить, потому что и вправду слишком вымученно получается, особенно с промежуточными переменными. Просто не предполагал, что для этого нужно саму консоль поменять. Что поделать - привык к квестовской.
И взаимно - хорошего дня и с наступающим праздником )
28.07.2011 в 18:25

Слова "не надо нервничать" хорошо помогают привести человека в нормальное состояние бешенства.
Менять не обязательно, просто зачем ставить сторонний софт там, где можно с тем же успехом справиться готовыми встроенными средствами? Я ведь указал варианты реализации этого же на квествоской консоли. Должно работать. Объекты на выходе то практически одинаковые получаются. У себя не проверял, т.к. PowerPack для AD сейчас не установлен за ненадобностью.
28.07.2011 в 19:36

We rise up for the things we believe in over and over again
Менять не обязательно, просто зачем ставить сторонний софт там, где можно с тем же успехом справиться готовыми встроенными средствами?
Именно это я и имел в виду )