IT-Service / ITG.DomainUtils

Модуль PowerShell, предоставляющий командлеты для выполнения типовых операций при обслуживании / развёртывании домена на базе MS Windows Server
1 stars 1 forks source link

Создать набор командлет для "регистрации" принтеров и их публикации #1

Closed sergey-s-betke closed 11 years ago

sergey-s-betke commented 11 years ago

Описал Get-ADPrintQueue. К сожалению, не смог определить модульные тесты с помощью pester для этой функции, потому как при создании прокси функций для функций с несколькими наборами параметров посредством

[System.Management.Automation.ProxyCommand]::Create($MetaData) 

определения параметров не воспроизводятся вовсе.

Назначение Get-ADPrintQueue - обёртка вокруг Get-ADObject, по аналогии с Get-ADUser.

sergey-s-betke commented 11 years ago

Кратко, что требуется:

Естественно, в самом модуле - всё должно быть независимо от конкретного домена. Но в качестве примера можно как раз привести файлы, использующие модуль применительно к нашему домену. И обязательно в справке подробные примеры привести

sergey-s-betke commented 11 years ago

Решать задачу будем по частям, с модульными тестами. И первая задача: создание контейнера для каждого принтера. Использовать для этих целей OU нет смысла, это же не подразделение явно. Предлагаю использовать класс container. Объекты этого класса прекрасно видны и в консоле ADUC, но только при включенной опции "Дополнительные компоненты". Хуже будет другое: эти контейнеры не будут видны в консоли "Управление групповой политикой".

Посему предлагаю класс контейнера задавать через параметр, пусть и со значением по умолчанию.

Итак, функции:

Практически для всех функций модуля имеет смысл задать один общий параметр - DomainUtilsBase. Общий - для того, чтобы в PoSh 3 его можно было задать через умолчания. И для указанных выше командлет дополнительный параметр - ContainerName. Его значение по умолчанию - через локализацию.

sergey-s-betke commented 11 years ago

Добавить для Get-ADPrinter поддержку для Identity имени принтера.

sergey-s-betke commented 11 years ago

Теперь пора приступать к:

sergey-s-betke commented 11 years ago

И, на сладкое, - необходимо изменять параметры безопасности на самой очереди печати. Вижу два варианта выхода из положения:

Второй вариант мне кажется более правильным. И более гибким. И позволит предоставить доступ к очереди печати и в случае временной недоступности контроллеров домена.

В итоге - идём по второму варианту.

sergey-s-betke commented 11 years ago

Долго думал над наименованиями функций.

sergey-s-betke commented 11 years ago

New-ADPrintQueueGroup готова, теперь Get и Update. Для Update есть как раз смысл предусмотреть флаг Force для принудительного создания групп в случае их отсутствия.

sergey-s-betke commented 11 years ago

При создании GPO следует подумать: возможно, при инициализации имеет смысл создать StarterGPO, с которого потом копировать GPO для каждой очереди печати. Такой вариант будет более гибким, как мне кажется...

sergey-s-betke commented 11 years ago

Подключение принтера через GPO сценарием - не самое очевидное занятие. Затрагивает и file part, и ad part:

Использовать коммерческий модуль ради этой задачи мы не будем, сценарием поправим сами и AD part, и file part. При этом сначала попробую поправить только AD part, возможно - этого будет достаточно?

sergey-s-betke commented 11 years ago

Подключение очереди печати через ad part и через file part GPO - два альтернативных пути. Первый мне нравится даже больше, но необходимо проверить, будет ли он работать без запуска pushprinterconnections.exe. Если да - будем использовать его, я думаю.

Второй путь так же не сложнее, но придётся создавать / изменять xml файл в file part GPO.

sergey-s-betke commented 11 years ago

GPP (через file part) существенно гибче в настройках, безусловно. Пусть и сложнее, но склоняюсь к варианту публикации через GPP (через file part GPO).

sergey-s-betke commented 11 years ago

Параметры, отвечающие за авторизацию, целесообразно удалить. Иначе вызовы тех же *-GPO сильно усложнены будут. Если необходима явная авторизация - можно использовать сессии PowerShell. Предлагаю оставить только два параметра:

По последнему параметру есть ряд вопросов. Целесообразнее решить вопрос с хранением параметров модуля в AD. Тогда последнего параметра не будет. Так что целесообразно предварительно решить вопрос с хранением параметров, на этом этапе - через инкапсуляцию в командлетах.

sergey-s-betke commented 11 years ago

Есть неочевидные моменты. Например, для Get-ADPrintQueue как "совместить" параметры Domain и SearchBase?

С другой стороны - а зачем совмещать? Никто не говорил, что мы должны "искать" очереди печати в том же домене, в котором будем создавать объекты GPO. Поэтому в указанном командлете параметра Domain быть не должно. А в командлетах, отвечающих за GPO, - не будет SearchBase, что логично.

sergey-s-betke commented 11 years ago

Итак, работу с конфигурацией вынес в отдельный файл и командлеты, модуль заново отладил и сократил параметры благодаря конфигурации. И снова возвращаюсь к отладке создания GPO+GPP.

sergey-s-betke commented 11 years ago

Итак, New-ADPrintQueueGPO в первой редакции работает. Однако, есть проблемы с созданием GPLink. В контейнере (не OU) создать связь невозможно. Да и в консоли Управление групповой политикой видны будут только OU.

Так что пока вопрос, какого класса контейнеры использовать. Как минимум, при создании связей необходимо проверять класс и создавать связи только в OU.

sergey-s-betke commented 11 years ago

Обеспечил поддержку для New-ADPrinterGPO и класса контейнера OU с созданием ссылок на объекты политик в контейнерах очередей печати (только для OU).

Разумно и необходимо так же создавать ссылки на эти объекты сразу в некий OU, который будет являться "корневым" для размещения учётных записей наших пользователей и учётных записей наших ПК. Расположение этого OU необходимо сохранять в конфигурации. Создание данной ссылки разумно сделать опциональным, по флагу в параметрах командлета.

sergey-s-betke commented 11 years ago

Добавил Get-ADPrintQueueGPO.

sergey-s-betke commented 11 years ago

Необходимо:

Эти шаги необходимы для Update-ADPrintQueueEnvironment (там же и New-*, и Remove-*). Этими командлетами основной функционал для принтеров завершим.

Дополнительный функционал:

И, естественно, необходимо всё подробно описать в readme.

P.S. Склоняюсь к целесообразности выделения ITG.DomainUtils в качестве самостоятельного модуля. Слишком уж они получаются ёмкими, в том числе и по описанию.

sergey-s-betke commented 11 years ago

Всё-таки, целесообразно исключить контейнеры, создаваемые для каждого принтера. И name для групп, естественно, в этом случае потребуется изменить.

sergey-s-betke commented 11 years ago

Убрал контейнеры, изменил имена групп.

sergey-s-betke commented 11 years ago

Данный функционал выделен в отдельный модуль - https://github.com/IT-Service/ITG.DomainUtils.Printers