• ↓
  • ↑
  • ⇑
 
Записи с темой: scripting (список заголовков)
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

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

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

23:51 

Powershell + Яровая

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

WTF, спросите вы, глядя на заголовок. Внезапно, объединение необъединимого - политоты и Powershell, отвечу я. WTF дважды, зададите вопрос вы?

Для начала идем сюда: vote.duma.gov.ru/vote/95967
Тут лежит поименный список тех, кто голосовал (или не голосовал) по "пакету Яровой" и как. Пакет принят, ок, мы это уже знаем. Фильтруем этот список по фракции ЕР. Бегло просматриваем результаты, и убеждаемся, что практически вся эта фракция голосовала "За" (Романов Антон Васильевич - тебя и твой единственный голос разума мы будем помнить). Учитывая, что Яровая как раз из ЕР - что это было? Приказ сверху? Впрочем, интересует не это. Интересуют цифры.

Копипаст всей отфильтрованной таблицы в обычный текстовый файл, сохраняем его под именем file.txt, после чего в консоли Powershell даем следующее:

get-content d:\file.txt | select-string "ЗА" | measure-object


На выходе получаем искомое число: 235. Мы отсекли одного проголосовавшего "Против" (см. выше) и еще двоих - один не голосовал, второй - воздержался. А теперь еще раз смотрим на страницу с поименным голосованием и ищем там строчку Кворум. И смотрим значение - 226.

Господа! У нас просто не было шансов. НИ. ЕДИНОГО. ШАНСА.

P.S. Только сейчас заметил, что на той странице уже выложена процентовка по голосовавшим, по фракциям в том числе. Ну да ладно, лишний повод запустить консоль для тренировки лишним не будет :)

@настроение: предлагаю догадаться самостоятельно...

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

10:50 

Printers - mass rename and reconnect

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

Относительно недавно на работе была открыта новая площадка. Назовем ее Loc-05 (Location-05), где 05 - ее индекс, пятая по счету. Все шло хорошо, туда даже сотрудники уже заехали, оборудование поставили, принтеров много-много завезли. Об этих-то принтерах речь и пойдет.

Схема их подключения такова. Все это - МФУ, сетевые устройства. Они все заведены на принтсервер, им включен общий доступ, и они опубликованы в AD. Конечным пользователям все эти принтеры подключаются через групповую политику, раздел Group Policy Extensions - Control Panel, Printers.

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

Принтеры были заведены с именами Loc-05-.....

И теперь встала проблема. Оказывается, индекс 05 уйдет другой площадке. Стало быть, необходимо все эти принтеры переименовать и заново подключить сотрудникам. Учитывая, что принтеров там больше сотни, руками это делать - упаришься.

Начинаем разбираться.

Что нужно сделать с каждым из этих принтеров?
1. Снять публикацию принтера в AD, убить общий доступ.
2. Переименовать принтер на принт-сервере.
3. Включить общий доступ под новым именем, опубликовать заново принтер в AD.

Хорошо, идем дальше. В схеме работы участвуют еще группы и политика. Разбираемся с группой.

Тут все просто - переименовываем ее, и дело с концом. Попутно меняем атрибут SAMAccountName, чтобы он совпадал с новым именем группы. При переименовании через GUI система автоматом предлагает это сделать, но имеем это в виду.

Последний участник этого балета - политика. Вот тут сложнее всего. Править ее ручками в редакторе политик на все 100+ принтеров - это ж можно упариться. Но политика - это обычный текстовый файл, который можно обрабатывать как текст в любом редакторе. Учтем и это.

Приступаем к реализации плана.

1. Переименование принтеров на принтсервере. Примем во внимание, что принтсервер у нас основан на Win2012 - вся мощь Powershell в наших руках, так что прямо на этом принтсервере выполняем следующее:

Код выберет на принтсервере все объекты принтеров, имя которых содержит в себе Loc-05, после чего сделает все ранее описанные действия, в том числе и переименование самого принтера. Новым именем будет Loc-06.

2. Переименование групп. Тоже ничего сложного. Разве что нужно убедиться, что на компьютере, где будет запускаться код, установлен модуль ActiveDirectory для Powershell. Единственное, что нужно будет сделать, это поменять OU, где скрипт будет искать нужные нам группы.


3. Действия с политикой. Получить текстовый файл можно двумя путями. Либо мы лезем в каталог sysvol и блуждаем там в дебрях каталогов, либо мы просто выполняем бекап этой политики к себе в папочку. Второй метод проще.

Примечание. \\PS - это имя моего "ручного" принтсервера. EXAMPLE\ - имя такого же "ручного" домена. В рабочей среде эти имена будут другими.

Получив к себе в распоряжение текстовик, начинаем в нем копаться. Нас интересуют строки вот такого вида:

Именно они и определяют принтеры. Что и где нам придется поменять?
name="Loc-05-PDF24" - это очевидно - имя принтера. В нашем случае меняется на name="Loc-06-PDF24"
status="Loc-05-PDF24" - в ту же степь, что и имя принтера. Меняется на status="Loc-06-PDF24"
path="\\PS\Loc-05-PDF24" - здесь показано имя общего устройства, меняем на нужное. Меняем на path="\\PS\Loc-06-PDF24"
name="EXAMPLE\Loc-05-PDF24" - имя той самой группы безопасности, членам которой этот принтер будет подключаться. Меняем на name="EXAMPLE\Loc-06-PDF24"

Очевидно, что все эти изменения можно сделать одной операцией в Блокноте:
Ctrl+H, Loc-05 -> Loc-06

Но это еще не все. Остался последний этап, нужно заставить эту же самую политику отключить на компьютерах пользователей сетевой принтер с уже недействительным именем Loc-05*
Для этого берем строку, определяющую принтер, копируем ее в буфер обмена и вставляем прямо под исходной. А теперь меняем ее так, чтобы она удаляла старый принтер. Ниже я приведу список тех атрибутов, которые нужно поменять.

name="Loc-05-PDF24" - оставляем старое имя принтера
status="Loc-05-PDF24" - см. выше.
path="\\PS\Loc-05-PDF24" - см. выше.
name="EXAMPLE\Loc-05-PDF24" - поскольку мы теперь применяем это действие к членам уже переименованной группы, ставим новое имя - name="EXAMPLE\Loc-06-PDF24"
changed="2016-05-20 12:45:45" - очень интересный параметр, показывает, когда был изменен этот элемент политики. В новой строке меняем его так, чтобы показанная в нем дата была больше, чем в исходной строке. Не знаю, может быть это совпадение, может быть еще что-то, но до тех пор, пока я не изменил этот атрибут, старые принтеры у меня не отключались. Предполагаю, что имел место некий конфликт между записью о подключении принтера и записью о его удалении. Поставим туда текущую дату, которая будет заведомо больше, чем дата подключения: changed="2016-05-21 12:45:45"
image="2" - это картинка, которая высвечивается в редакторе политик. Значение 2 покажет желтый треугольник, значок действия Update. Значение 3 покажет красный крест, значок действия Delete. Ставим 3.
action="U" - само действие. U - Update, нам же нужно D - Delete.

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

И вот так - для каждого принтера.
В конце концов мы сохраняем полученный текстовик, восстанавливаем политику AD из этого текстовика. После этого, в тот момент, когда пользователь, перечисленный в группе EXAMPLE\Loc-06-PDF24, войдет на свой компьютер, ему тут же подключится новый принтер, а старый - будет удален.

Problem solved.

UPD. Вторичная и последующие проверки показала, что параметр changed="..." можно не трогать, все работает из без его изменения.

@музыка: Need for Speed - Most Wanted, RAP Sheet

@настроение: побольше бы таких задач...

@темы: PowerShell, Scripting

07:22 

Poweshell + SNMP

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

Все гораздо проще. Не нужны никакие сторонние библиотеки - все уже украдено до нас написано, и давно.
Учитывая, что нам нужно только читать знаничения OIDов, можно воспользоваться самым базовым функционалом, придуманным еще для принтеров, и доступным аж с ванильной Win 7.

Все! Дальнейшие обвязки этого ядра скрипта - вопрос личных предпочтений.

@музыка: Iron Maiden - Can I play with madness

@темы: Scripting, PowerShell

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

главная