• ↓
  • ↑
  • ⇑
 
Записи с темой: powershell (список заголовков)
22:44 

DPM - Active Tasks List

В Dash'e под Chronostasis'ом.

MS DPM - штука такая, за ней глаз да глаз нужен. Точнее, не за ней самой, а за одним типом задач - System State Protection. Частенько бывает так, что такая задача зависнет на пять-шесть часов, и только почем зря занимает ресурсы сервера. Обычно в таком случае мы просто прерываем ее и запускаем заново. Полчаса - и бекап состояния системы готов. Но для того, чтобы задачу перезапустить, ее надо увидеть. А для этого нужно зайти на сам сервер DPM. А... Согласен, слишком много "А", но тем не менее: а консоль DPM - штука очень неторопливая, да и самих серверов далеко не одна штука. Заходить на каждый и смотреть, что там творится - да проще убиться веником. Powershell to the rescue!

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

@музыка: E-Mantra - I shall not care

@настроение: Neutral

@темы: Scripting, PowerShell, DPM

18:11 

DFSR Backlog - Все сразу

В Dash'e под Chronostasis'ом.

Про Backlog в DFSR уже давно доводилось писать. Возникла нужда снова воспользоваться именно этим способом наблюдения за репликацией, только уже для значительно большего числа групп реплик. А потому хочется уж написать скрипт так, чтобы он работал и для текущих групп, и для всех новосозданных, если такие будут.

А уж что делать с табличкой, утрамбованной в переменную $output - на усмотрение конечного пользователя.

@музыка: Project Blue Sun - Besame (Radio Edit)

@настроение: а за окном дожди и хмарь...

@темы: Scripting, PowerShell

00:08 

Printer Ports and SNMP

В Dash'e под Chronostasis'ом.

Поступила задача - на большой-пребольшой куче принтерных портов включить галку SNMP Enabled, исключая те, к которым подключены принтеры модели HP 577. При создании всех тех принтеров мы как-то пропустили тот факт, что она не ставится автоматом. Для новых объектов поправили, а что делать с уже имеющимися? Первая мысль: ну не вопрос, в одну руку порт, в другую Set-PrinterPort... Hey, cousin, it doesn't happen! (c) Командлета Set-PrinterPort не существует в природе. Ладно, но есть жабросли WMI:

Хотя и знаю, что правильнее было бы использовать Get-WmiObject -Class win32_TCPIPPrinterPort -filter 'бла-бла-бла', а не Get-WMIObject | where {бла-бла-бла}, но есть затык. В фильтр я так и не смог загнать переменную. А жаль.

@музыка: Sabaton - Blood of Bannockburn

@темы: Scripting, PowerShell

19:15 

Data Protection Manager - Backup Statistics

В Dash'e под Chronostasis'ом.

Идея вертелась уже черт знает сколько. Наконец-то руки дошли до реализации.
Мысль проста - прийти на рабочее место в начале недели, открыть файлик и посмотреть, что у нас с бекапами. Когда и для какой группы защиты и источника данных была создана последняя точка восстановления. Шастать каждый раз для этого в монструозную консоль DPM - увольте, я успею напиться кофе, пока она откроется. Так что в первом приближении все будет выглядеть вот так:

Task Scheduler, все дела. Затем создается связь в Excel на полученный txt-файл, и дело сделано. При желании можно расширить и на несколько площадок, чтобы вообще всю статистику получить.

@музыка: Philippe Alexandre Belisle - Impovisation

@настроение: клац-клац-клац

@темы: PowerShell, DPM, Scripting

00:00 

Lostfilm RSS

В Dash'e под Chronostasis'ом.

Враги-лостфильмовцы с переходом на новую версию сайта допустили то, чего я опасался больше всего - RSS уложили отдохнуть. Не работает загрузка через нее больше. Спасибо добрым людям - дали ссылку на топик старого сайта, где рассказали, что делов-то всего - получить старую RSS, заменить одно на другое, после чего скормить полученное торренту. Закавыка всего одна - торрент в принципе не работает с локальными файлами, из чего следует, что исправленную ленту нужно заливать на какой-нибудь сайт. Ну и предлагалось использовать PHP для модификации. Вот только PHP я не люблю, да и держать его не на чем.

Хм... но никто же не мешает поднять IIS. Хотя любви к PHP это не прибавит, но можно и без него обойтись. Главное, что будет куда выкладывать новую ленту.

Итак, имеем следующее.
Исходная лента доступна по адресу

В полученном xml-документе мы должны найти все вхождения

и заменить их на


Как поднять IIS и проверить, что она работает - мануалов тонны. Дальше в дело вступает Powershell:


Файл-результат будет сохранен сразу в веб-каталог IIS. Соответственно, нужны права на запись в него тому пользователю, от чьего имени будет выполняться это задание.

Дальнейшее - тривиально. Task Scheduler, запуск этого скрипта с заданным интервалом под нужной учеткой. Как только увидели, что нужный файл сформировался в каталоге IIS - натравливаем на него torrent-клиент ровно с теми же параметрами, что ранее были заданы для обычной ленты RSS LostFilm.

Готово! Можно кушать :)

@темы: PowerShell, Scripting

17:59 

Powershell Libraries...

В Dash'e под Chronostasis'ом.

Вот раньше как было?


И это спокойно себе работало.

С недавнего времени отказало. Точнее - работает, но только если этот код вызывается из ISE. Там куча всяких библиотек подгружается в фоне. Проверяем:


Поменяли подгрузку в 5.1 Теперь приходится ручками писать:


Предупреждать надо!

@музыка: John Marting - Anywhere gor you

@темы: Scripting, PowerShell

14:53 

Powershell + Yandex.Music + MP3 Tags #2

В Dash'e под Chronostasis'ом.

Гость натолкнул на интересную мысль. --add-metadata - штука хорошая, но требует наличия на компьютере какого-нибудь, ну хоть плохонького, но энкодера. А поставить его бывает возможность не всегда. Но мысль заключается в следующем - сохранять метаданные можно не только напрямую в результирующий mp3, но и просто в файл. Так почему бы и нет? Уж распарсить получаемый на выходе json powershell сможет всегда. А рядом с тем же youtube-dl положить маленький любимый id3.exe - и вовсе не проблема.
Остальные условия те же - ссылку для скачивания скрипт берет прямо из буфера обмена.
Поехали!

@музыка: Years & Years - King

@темы: Scripting, PowerShell

19:17 

Poweshell - Fixing Printer Group Policy

В Dash'e под Chronostasis'ом.

Очередной день, очередные тесты. Вводим в тестовую среду виртуалку с Win 7 в качестве клиентской ОС и начинаем править скрипт таким образом, чтобы результирующие файлы были в нужной кодировке и читались как серверами, так и клиентами.
Смотрим на исходные файлы "живых" политик:
Printers.xml - UTF8
GPT.ini - Windows-1251.

Лезем скрипт, находим там строку

После чего меняем ее на вот такую конструкцию:

Через Stream Writer мы запишем Printers.xml в нужной кодировке - UTF8. Она НЕ равна Unicode, в котором Powershell соберется записать файл по-умолчанию.
С GPT.ini все проще. В инструкции

просто добавляем требуемую кодировку:

После чего gpupdate на клиентах, и наблюдаем красивые безошибочные журналы System и Application.
Дело за проверкой в боевых условиях. Нужна тестовая политика уже там.

@музыка: Ryan Farish - Sunshine in the Rain

@темы: PowerShell, Scripting

09:59 

Powershell and Group Policy files

В Dash'e под Chronostasis'ом.

Вчера мне кого-то очень сильно хотелось покусать. И это меньшее, что можно было сделать.
Скрипт, который работает с политикой расстановки принтеров, успешно оттестированный в изолированном окружении, был перенесен в боевую среду. Отработал на ура. Даешь пачку принтеров, выбираются нужные политики, в них вносятся нужные параметры, в общем - все прекрасно. Открываем политики в оснастке - все видно, все читается, все на местах.
Но как только клиентская Win 7 пытается такую политику прочитать - все рушится на корню. А в логах контроллеров домена вообще прекрасное: Windows cannot access the file gpt.ini. Якобы нет ни этого файла, ни самого Printers.xml, в котором принтеры лежат. Хотя все проверки показывают, что файлы - вот они, на местах.

Ломали мозг весь вечер. Сломали, отключили пару пораженных политик, от греха подальше.

Под конец моего рабочего дня, когда уже никого не было, мне пришла в голову дикая мысль. Если файл есть, но система говорит, что не может его прочитать, дело может быть в двух вещах - либо это права доступа, либо это ересь в содержимом. Права мы проверили, содержимое тоже, вся структура XML и GPT.ini на месте. Что еще? Содержимое мы можем не опознать, если не понимаем, что там написано, то есть кодировка не та. Открываю в том же Блокноте файл живой политики, даю команду Save as..., и система предлагает дефолтный вариант - ANSI. Открываю файл дохлой политики, даю ту же команду - держи Unicode. Метод xml.save() по-умолчанию сохраняет документ именно в UTF-8, out-file - аналогично.

Дальше идет очень-Очень-ОЧЕНЬ много самых отборных матюков, которые только могут прийти в мою голову. Насквозь юникодная семерка не может читать юникодовые файлы политик, подавай ей ANSI. 2012-ая ровно в таких же условиях отрабатывает на ура.

С утра пересохранили нужные файлы, включили политики (у меня на это прав нет), все отреплицировалось, все заработало. Но повторюсь - очень-Очень-ОЧЕНЬ много нехороших слов.

Скрипт пока отставили, надо его доработать, чтобы он мог с разными кодировками дружить.

@темы: Этот безумный мир, PowerShell

20:32 

Powershell - Printer Policy Complete

В Dash'e под Chronostasis'ом.

Сделано. Решение "влоб" отменяется. MS XML оказался намного проще, чем я полагал все это время.
На вход - csv c полем Name (в нашем случае - ищется файл printers.csv в папке Документов текущего пользователя), где будут перечислены отображаемые имена принтеров. На выходе - заполненные политики по разливке этих принтеров пользователям на основе групп доступа. Принтеры будут расставляться членам групп с именами, равными названиям принтеров.
Политик две. Предполагается, что принтеры на первой площадке попадают в политику Map-Printers-01 и крутятся на принт-сервере ps1, принтеры второй площадки разливаются через политику Map-Printers-02 и сидят на сервере с названием ps2.
Если вдруг скрипт обнаружит, что для какого-то принтера не создана группа доступа, скажет об этом и пропустит принтер.
Если будет обнаружено, что в целевой политике уже есть запись для добавляемого принтера - будет предложено ее (или их, если их много - бывает и так) пересоздать. Если отказаться от этого - принтер будет пропущен.
И важный момент. Обе политики уже должны существовать, и в них должен быть заведен хотя бы один принтер. В противном случае в каталоге политики в SYSVOL будет отсутствовать файл Printers.xml, а создавать его политика не обучена (мне было лень).
Поехали!

@музыка: Joe Satriani - Speed of Light

@настроение: Getting the things done!

@темы: PowerShell, Scripting

23:21 

Lucifer, Maze, Powershell

В Dash'e под Chronostasis'ом.

Повод для этой записи для меня необычен. На дайриках полно заметок, где народ всякие гифки выкладывает с полюбившимися им киноперсонажами. Вот эта напасть и меня не миновала. Знакомьтесь: Мейзикин (Мейз) из Люцифера.

Вот казалось бы, чего такого - простой поворот и наклон головы. Но именно на этот жест я залип. Да крепко так. Настолько, что пришлось все же освоить науку создания этих ваших гифочек. VirtualDub не подкачал, но пока-а-а-а я смог скормить ему все 63 кадра разом, а до этого еще и руками нарезать эти кадры, потому что формат MKV мало кто способен понять и сделать раскадровку.
С кормежкой VirtualDub вообще азаза получилось. До этого я вовсе ни разу с программкой не работал (как-то не было нужды), потому о том, каким образом ему подсовывать цепочку картинок, не имел ни малейшего понятия. А в окне выбора файлов можно выбрать только один. И как же быть? Да вот так и быть - файлы должны иметь номер в конце. Ну то есть:
File1.jpg
File2.jpg
File3.jpg
...
Ок, не вопрос:

Но и после этого VirtualDub не захотел кушать всю цепочку. Что ж не так? А вот что. MPC HC, которым я резал кадры, сохраняет их с вымученным названием, например,
Lucifer.S02E05.1080p.rus.LostFilm.TV.mkv_snapshot_11.19_[2016.10.30_23.16.35].jpg
В общем и целом, благодаря квадратным скобкам и тому, что между ними, VDub не расценивал эти файлы как часть цепочки. Кстати, сами квадратные скобки еще в Powershell попортили немного крови, пришлось воспользоваться ключом -literalpath при переименовании, иначе PSH эти файлы в упор не видел.
Ладно, тот же скрипт, но вместо $file.basename ставим "LuciferS2-E5-" - и все стало просто замечательно.

@музыка: E-Mantra - Kaleidoscope Clouds

@настроение: А все же залип... Впрочем, Мейз и без этого хороша, особенно в действии :)

@темы: PowerShell, Scripting, Этот безумный мир, Этот веселый мир

01:30 

Powershell - Complete Printers Info

В Dash'e под Chronostasis'ом.

Бессонные ночи того стоили. Однозначно (с)
Хотя нет. Бессонные ночи - это автоматизация настройки принтеров на DHCP и принт-серверах, и это только часть общего дела. Есть и другая часть, не менее муторная, если не более - учет этих самых принтеров. И ведется он, как бы так помягче сказать - из рук вон плохо. Поскольку в Excel-файлы, хранящие в себе сведения по разным офисам данные о добавленных или убранных принтерах вносит куча народа, неизбежны ошибки. А кто-то вообще забудет это сделать. Чего уж там, скорее всего и я в этих файликах тоже косячил.

И в итоге вся отчетность плывет.

Отныне это должно измениться, потому что вся отчетность будет создаваться автоматом на основе реальных данных DHCP и PS: сценарий сформирует сводный csv-файл с кучей информации по резервированным адресам на DHCP серверах и принт-серверах, а сделанная и сохраненная excel-таблица (роль которой - сугубо удобное представление данных) будет кормиться как раз из полученного csv.

Но прежде, чем переходить к самому скрипту, хотелось бы положить в запись ссылку на следующую страницу:

Join-Object - Technet

Скрипт Join-Object фактически реализует такие интереснейшие вещи из мира баз данных, как Join'ы. Именно FULL JOIN позволит нам связать сведения от DHCP-серверов и серверов печати. Прекраснейший скрипт, за который огромное спасибо ребятам из команды MS Powershell. Ну а подключить его к основному сценарию достаточно просто - через dot-source - прямо в первой строке нашего сценария. Что ж, поехали:

Окинув взглядом получившуюся в Excel мега-таблицу увидел в ней сто-о-о-о-о-олько интересного! :)

@музыка: Mark Farina - Sexy Fire (Factory Boom Boom Mix)

@настроение: Overall progress - 50% - nice!

@темы: Scripting, PowerShell

14:35 

Powershell - Continue

В Dash'e под Chronostasis'ом.

Однако, здравствуйте. Оказалось, что оператор Continue, который должен переходить к следующей итерации цикла, внутри которого он вызван, не работает в некоторых случаях. Вот пример:

Суть кода - в switch проверяется значение переменной $i. Если оно равно 8, пишется предупреждение, вызывается оператор Continue, и скрипт переходит к итерации под номером 9. Во всех остальных случаях switch не делает ничего, и сценарий выполняет следующую за switch инструкцию "напиши мне значение переменной $i. А вот что мы получаем на самом деле:

С другой стороны, исправь мы код совсем чуть-чуть, получим ровно то, что требовалось:

Получается, что continue тоже считает switch за цикл? Это засада.

@музыка: Sandra - Hi! Hi! Hi!

@темы: PowerShell, Scripting

11:51 

Shared Printers and Group Policy

В Dash'e под Chronostasis'ом.

It is done!
Последнее, что мне никак в моей опупее по автоматизации развертывания принтеров не давалось, так это подстановка новых принтеров в групповую политику. Среди всех команд Powershell, работающих с GPO, нет ни одного, который бы позволял менять GPPreferences. Точнее, есть, но работают они несколько не с тем, что нужно.
А недавно стукнуло в голову - описания принтеров, которые раскатываются на рабочие места, это ни что иное, как XML файл, лежащий в SYSVOL по вполне себе известному пути. А что если выправить непосредственно этот XML файл, а потом посмотреть, что будет.

Как водится, разъяснения, что тут и как.
В качестве входных параметров в этом коде присутствуют имя принтера, который будет прописывать в политику, имя принтсервера, на котором живет общий ресурс этого принтера, и имя политики, которую будем менять. Все остальное вычисляется автоматом на основании этих данных. В финальном виде входными данными будет только имя принтера, но это уже за рамками данной записи.
Скрипт предполагает, что группа, членам которой будет подключаться этот принтер, уже создана, а ее имя совпадает с именем принтера. При желании проверка на наличие этой группы в AD прописывается очень просто.
Отдельно пара слов о блоке Raise Version of policy. Номер версии групповой политики никак не влияет на репликацию самих файлов политики, а вот для клиентских рабочих станций он может иметь большое значение. Именно поэтому данный блок и введен. Как рассчитывается и как хранится номер версии - в сети материала полно, от себя лишь скажу, что это было весьма интересно.
P.S. Согласен, что сборка XML структуры в виде текста - решение "в лоб". Но как показывает практика, иногда именно такие решения работают надежнее всего.

@музыка: Stellardrone - Comet Halley

@темы: Scripting, PowerShell

17:36 

DX:MD - Scripts

В Dash'e под Chronostasis'ом.

Ссылки. В прошлой записи ссылок на картинки было под пять десятков. Прописывать все это руками, конвертируя то, что отдает imgur.com - да проще было бы убиться. Ну а поскольку в моей жизни еще не все дела переделаны, убиваться рано (вот разве что кого-то убить... ой, что-то я не туда полез...).

В общем и целом. Есть куча однотипных ссылок на картинки. Нужно отконвертировать их в ссылки с поддержкой мелких (или не очень мелких) превьюшек. Скажем, если ссылка имеет такой вид:

то приобрести она должна вот такой:

Создается обертка в виде тега "a href" и немного меняется путь к той картинке, которая будет выступать в виде превью: в ее имя перед расширением добавляется буква "l".
От копипаста исходных ссылок с imgur ничто не спасет, ну не нашел я там функции экспорта линков. А вот все дальнейшее прекрасно в итоге автоматизируется:

В файл d:\links.txt закидываем imgur'овские ссылки по одной в строку, а полученное на выходе вставляем в форму новой записи на дайриках и разбавляем комментариями. Сделано!

@музыка: Sascha Dikiciyan - DXMD - 101 Trailer

@темы: PowerShell, Scripting

21:23 

Powershell + Yandex.Music + MP3 Tags

В Dash'e под Chronostasis'ом.

Скажу сразу - на данный момент Яндекс.Музыка похоронила эту идею, но вдруг найдется обходное решение.
Ну не хочу я ставить себе на телефон клиент ЯМ для того, чтобы иметь доступ к своей подборке музыки. В то же время есть консольная утилитка youtube-dl, которая вполне себе поддерживает загрузку треков оттуда. Одно плохо, mp3-файлы, формируемые на выходе, лишены всяческих тегов. Ни исполнителя, ни названия, ни уж тем более альбома и года. А хотелось бы. В то же время все эти данные есть на страницах треков в ЯМ. И их можно распарсить.

А вот что делать с полученными данными - уже на усмотрение конечного пользователя. Можно передать в тот же старый добрый id3.exe, можно что-то иное придумать...

Но с другой стороны, даже несмотря на неработоспособность youtube-dl в полупакетном режиме, все эти игры с ЯМ даром не прошли. Откопалось тут:


P.S. Как выяснилось, Powershell по-дефолту очень жаден (greedy) до регекспов. В будущем это стоит учитывать.

@музыка: Kim Wilde - Game Over

@настроение: прорвемся!

@темы: PowerShell, Music

00:08 

Вызов

В Dash'e под Chronostasis'ом.
Читая некоторые книги серии FR на английском (переведенного варианта просто нет в природе) неоднократно натыкаюсь на два термина: evocation и invocation. Оба они относятся к призыву чего-то потустороннего. Либо каких-то тайных сил, либо каких-то сущностей вида демонов, небесных существ, а то и вовсе дьявола или бога/богов. Но есть и различие. Весьма подробно оно раскрыто вот тут:
Difference between invocation and evocation

А пока ехал в автобусе, мелькнул в мозгах один из командлетов Powershell: Invoke-Command. Позволяет выполнить другую цепочку команд на локальном или удаленном компьютере с выводом результатов в текущую консоль. Что ж, все сходится, это таки invocation :)

@музыка: Project Blue Sun - Besame (Radio Edit)

@темы: PowerShell, Forgotten Realms

18:09 

Колобки

В Dash'e под Chronostasis'ом.

При всей моей нелюбви к графическим смайлам существует в природе ровно один набор оных, который мне все же нравится. Да, да, старый добрый "Колобок", известный еще со времен старого QIP и позднее перекочевавший и сюда, в дайрики. Случайно набрел на сайт, целиком и полностью посвященный этим картинкам. Вот он: www.kolobok.us/index.php
Там же можно стащить полный пак смайликов. Одна проблема - ну стащил ты его, а дальше что? Одному открывать их либо в IE по-умолчанию, либо во внешнем вьювере, если он стоит. Сейчас у меня на компе нет практически ничего, почти голая система. Ставить что-либо лишнее почему-то влом. А почему бы не показать все эти картинки разом на одной странице? Есть же стандартный HTML. А вывод какой-либо информации в html-файл освоен уже давно и вовсю используется в том числе и на работе еженедельно. Как уже повелось - ISE в зубы:

Просто и быстро:

Конечно, можно было бы заморочиться с таблицей в несколько колонок, а путь выводить в теге ALT, но мне было лень :)

@музыка: Yanni - Echo of the Dream

@темы: PowerShell, Scripting, Этот веселый мир

23:42 

Квоты #3 - Final

В Dash'e под Chronostasis'ом.

А теперь все и разом - шаблоны, авто-квоты и простые квоты. Сервером назначения является FS2.
Правила игры таковы:
1. Не может быть нескольких шаблонов с одним и тем же именем. Следовательно, если на сервере-истонике есть шаблон квоты на 100 Мб под именем "Шаблон1", а на сервере назначения есть шаблон на 200 Мб под тем же именем, шаблон перенесен не будет.
2. Нельзя назначить несколько авто-квот на один и тот же путь. Это же правило действует для простых квот.
3. Исходим из того, что пути к каталогам, на которые развешиваются квоты, одинаковы что на источнике, что на цели.
Поехали:

@музыка: Enigma - The Child in Us

@темы: PowerShell, Scripting

01:41 

Квоты #2

В Dash'e под Chronostasis'ом.

Все таки все вышло гораздо интереснее, чем казалось.
Можно. Можно посредством Powershell мигрировать квоты между серверами. Главное - чтобы совпадали имена дисков и путей. А теперь более развернуто.

Сначала камнем преткновения стал параметр -SoftLimit. Синтаксис его таков:
для задания мягкой квоты: New-FSRMQuota -path "blah" -size "blah" -softlimit
для задания жесткой квоты: New-FSRMQuota -path "blah" -size "blah"
то есть если нужен хардкор - параметр не указывается вовсе. Черт, а ведь я хотел бы более привычное -softLimit $True/$False. И как же это побороть? Читаем описание самого параметра и видим:

Accept Pipeline Input? True (ByPropertyName)

А это означает, что весь командлет New-FSRMQuota можно натравить на трубу, через которую будет передан объект, описывающей имеющуюся на сервере источнике квоту. будет примерно так:

Get-FSRMQuota | New-FSRMQuota

Произойдет следующее. Команда Get-... занесет в память объект с кучей свойств, в том числе будет и свойство -SoftLimit. Все это добро будет передано по трубе команде New-..., которая, зная, какие свойства в новом объекте надо заполнить, будет их по имени искать в переданном объекте. Найдет - подставит, не найдет - пропустит. Отлично, с этими разобрались.

Следующее: если в командлете New-FSRMQuota нет параметра вида -ComputerName, который бы сказал, где именно запускать процесс, то каким образом можно:
1. ухитриться запустить на удаленной машине
2. передать параметры квоты на эту самую удаленную машину.
Ответом на первый вопрос стал параметр -CIMSession. Идентификатор сессии, который можно предварительно задать при помощи командлета New-CIMSession. Этот параметр выступит полным аналогом так нужного мне -ComputerName. А со вторым оказалось все до боли просто - та же самая труба. То есть получаем вот такую конструкцию:

$session = New-CimSession -ComputerName FS2
Get-FSRMQuota | new-fsrmquota -CimSession $session

В итоге команда Get-... выполнится в локальной сессии, а New-... - в удаленной, при этом в качестве входных параметров будет использован объект, полученный в локальной сессии. Удобно!

Но не тут-то было. Идилия была просто разбита в кровь одной особенностью квот. Шаблоны. МС настоятельно рекомендует, чтобы все квоты были привязаны к какому-либо шаблону. Но ведь это не всегда так. В данном случае примем условимся, что шаблоны на обоих серверах совпадают. Вариант с разными шаблонами я не рассматриваю, там еще нужно огранизовать сначала миграцию самих шаблонов, а сейчас такой задачи не стояло.

А сама особенность заключается в следующем. Если в переносимой квоте не задан шаблон, то при выполнении конструкции Get-FSRMQuota | new-fsrmquota -CimSession $session команда New-... попытается создать новую квоту с параметром -Template, равным пустой строке. Логично, шаблон ведь не задан. И именно на этом моменте она выкинет ошибку. Если команда New-... вызывается с указанием параметра -Template, а в нашем случае он будет указан по-дефолту, то этот параметр просто обязан не быть равным пустой строке. Получается, еще до выполнения New-... нам придется анализировать, а была ли квота подвязана к шаблону, и если не была - то на вход команды New-... нужно передавать уже другой объект, в котором были бы все свойства исходного, кроме -Template. Ну что же, это выполнимо (в переменной $quota как раз хранится объект, описывающий квоту):


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

@музыка: Koan - After the Guiding Venus

@настроение: много кофе ночью на работе...

@темы: Scripting, PowerShell

Записная книжка

главная