Подстановка значений из списка при выполнении рутинных и однообразных операций в PowerShell

ActiveRoles Self-Service ManagerЯ слышал от своего старого товарища Паши Нагаева истории о возможности наполнения тестовых доменов пользователями при помощи скриптов PowerShell. Но ложка, как говорится, хороша к обеду. Мне это в то время было неинтересно, ибо других задач хватает всегда. И вот ползая по форумам TechNet в надежде получить очередную медальку (кризис однако чувствуется во всем, раньше Microsoft не скупилась на звезды Героев из чистого золота, теперь всего лишь медаль За отвагу :) ), я наткнулся на интересный вопрос, висящий в одиночестве, и без надежды на ответ. Тут я и вспомнил Пашу, PowerShell и подстановку значений из списка.

Суть вопроса: добавление адресов в блоклист не по одному, и не подсетями, а именно из какого-то абстрактного списка. Интересно, а как это сделать? Проверив в своей песочнице командлет Add-IPBlockListEntry, я убедился, что ввести более одного адреса не удается – недопустимое значение параметра. Я задал вопрос своему коллеге Илгизу Мамышеву, ибо он был одним из немногих контактов, находящихся в online в окошке моего Live Messenger, и имел в резюме навык “Windows PowerShell”. Илгиз натолкнул на мысль – это надо реализовывать с помощью циклов. “Используй … | foreach { $_.имя_свойства } и по конвейеру передавай набор на вход foreach”

Загадочная фраза для полного чайника в PowerShell. Для иллюстрации он посоветовал выполнить Get-Process | foreach { $_.ProcessName }. И тут до меня дошло. Пошел перебор процессов, и каждое имя выводилось в отдельной строке в результате выполнения фазы цикла. Хорошо, примем как данное. Но как же “скормить” командлету список?

Я полез в блог к Васе. Не то. Но нашел ссылку на http://powershellcommunity.poshcode.org где по его словам есть все-все-все на все случаи жизни. Но поиск по IPBlockList дали нулевой результат. Тогда я выкопал несколько скриптов, в описании которых значилось “Import value from list”. После их анализа (опять хочу обратить внимание коллег на комичность ситуации, анализирует человек ни разу в жизни не создавший даже банальный “Hello, world!”. Аналитик :) ) Я обратил внимание на команду Import-CSV. Вот она родимая, импорт из файла значений, разделенных запятыми. Еще одна порция пищи прожорливому Гуглу. Поиск привел меня на http://technet.microsoft.com/ru-ru/library/bb310752.aspx и затем на http://msexchangeteam.com/archive/2006/09/05/428833.aspx. Ну все. теперь я Мастер! :)

Итак, я создал файл CSV (долго чесал всякие места в раздумьях – нужен мне для этого MS Excel или обойдусь Блокнотом?), хватило блокнота. Получился файл вида:

Adr

10.0.0.1

10.0.0.2

10.0.0.3

10.0.0.4

10.0.0.5

10.0.0.6

10.0.0.7

Его то я и сохранил в корне диска С, с именем Adr.csv.

Далее пришел черед Exchange Management Shell.

Немного поэкспериментировав с синтаксисом я выполнил:

Import-CSV “C:\Adr.csv” | ForEach-Object –Process{Add-IPBlockListEntry $_.Adr}

Вуаля!

image

Проверим Get-IPBlockListEntry

image

Ага, завелось и заработало! Теперь я МегаМастер!

А зуд в известном месте не давал покоя. Дай-ка я и с пользователями так же разберусь?

И я решил раздать своим друзьям-коллегам из Вебзавода крутые и эксклюзивные почтовые ящики в популярнейшем домене IT-Internals.ru.

Но это, как говорится – совсем другая история :) Продолжение следует…

Реклама
Подстановка значений из списка при выполнении рутинных и однообразных операций в PowerShell

Подстановка значений из списка при выполнении рутинных и однообразных операций в PowerShell: 13 комментариев

  1. CSV нужен когда нужно использовать таблицы из нескольких значений, в данном же случае хватило бы Get-Content и обычного текстового файла со списком адресов:
    Get-Content «C:\Adr.csv» | ForEach-Object {Add-IPBlockListEntry $_}
    А если командлеты Exchange еще и качественно написаны, то должна работать такая конструкция:
    Get-Content «C:\Adr.csv» | Add-IPBlockListEntry

  2. Забыл расширение поправить у файлов, там .txt должно быть :) Ну или что угодно другое, главное чтоб внутри текстовые строки :)

  3. Олег Крылов:

    Вот так всегда. Вася нужен — Васи нет, а как критиковать, так вот он, Здрасте! :) Шутка. Спасибо Василий, но если бы ты вчера был online этой эпопеи не было бы вообще :) Я не читая документацию и не вникая глубоко в проблему нашел обходной путь. Главное это работает. А твои замечания обязательно учту, спасибо.

  4. Я вчера и позавчера был на rootconf’е :) И как всегда, именно в это время оказался всем нужен :)

  5. И вообще, это не критика, а просто дополнения. На самом деле я просто протащился от очередной демонстрации того как PowerShell помогает обычным людям, а не только скрипто-маньякам :)

  6. Олег Крылов:

    Для меня, еще полгода тому назад Exchange 2007 был полной загадкой. Я работал исключительно в Exchange 2003. Но жизнь кого хочешь научит. Вот и мне пришлось. Вначале меня бесило все, ибо я привык к GUI, как и все. Но с течением времени я проникся всей мощью EMS. И теперь мне намного проще набрать несколько строк в EMS, чем шарится по GUI. И это даже в моем чайниковском случае использования только стандартных командлетов, без переменных, циклов и т.п. Нашел несколько книжек — сяду за PoSH теперь уже по серьезному. Учитывая еще возможности PoSH v.2 по выполнению кода на удаленных машинах — наверное весь мой процесс администрирования в ближайшем будущем сведется к консоли.

  7. Успехов! :)
    Из книжек рекомендую PowerShell in Action, или если нет возможности читать на английском — Введение в PowerShell. Впрочем все уже у меня в блоге перечисленно :) http://windowspowershell.ru :)

  8. Олег Крылов:

    Возможность читать на английском есть. Это гуд :) Я начал с PowerShell Step by Step. Дело осложняется тем, что я в программировании полный ноль. Мне нужно с нуля для ПТУшников.

  9. Попробуй всё же In Action, первая часть по-моему вполне неплохо вводит в курс дела даже новичков. Steb by Step не читал, поэтому ничего сказать немогу.

  10. sach3000:

    делаю

    [PS] C:\>Get-Content «F:\Наш список спама\List.txt» | ForEach -Process{Set-SenderFilterConfig -Block
    edDomainsAndSubdomains $_}

    Смотрю

    [PS] C:\>Get-SenderFilterConfig

    Name : SenderFilterConfig
    BlockedSenders : {}
    BlockedDomains : {}
    BlockedDomainsAndSubdomains : {bmsiot.com}
    Action : Reject
    BlankSenderBlockingEnabled : True
    Enabled : True
    ExternalMailEnabled : True
    InternalMailEnabled : False

    Добавляется только последняя запись
    Что делаю не так ???
    В файле записей больше сотни.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

w

Connecting to %s