Closed sergey-s-betke closed 11 years ago
Кратко, что требуется:
-WhatIf
и прочие параметры, обязательно!Естественно, в самом модуле - всё должно быть независимо от конкретного домена. Но в качестве примера можно как раз привести файлы, использующие модуль применительно к нашему домену. И обязательно в справке подробные примеры привести
Решать задачу будем по частям, с модульными тестами. И первая задача: создание контейнера для каждого принтера. Использовать для этих целей OU нет смысла, это же не подразделение явно. Предлагаю использовать класс container
. Объекты этого класса прекрасно видны и в консоле ADUC, но только при включенной опции "Дополнительные компоненты". Хуже будет другое: эти контейнеры не будут видны в консоли "Управление групповой политикой".
Посему предлагаю класс контейнера задавать через параметр, пусть и со значением по умолчанию.
Итак, функции:
Test-ADPrintQueueContainer
(псевдонимов будет несколько. Test-ADPrinterOU
, в часности). - предикат, проверяющий наличие контейнера для нашей очереди печатиNew-ADPrintQueueContainer
- создание контейнера. Без групп, только контейнер.Get-ADPrintQueueContainer
- собственно получение объекта контейнера для объекта очереди печати.Set-ADPrintQueueContainer
- изменение атрибутов контейнера. Вне зависимости от класса контейнера параметры этой функции позволят изменять только атрибуты контейнера. И только те, которые имеют смысл для контейнера очереди печати.Практически для всех функций модуля имеет смысл задать один общий параметр - DomainUtilsBase
. Общий - для того, чтобы в PoSh 3 его можно было задать через умолчания. И для указанных выше командлет дополнительный параметр - ContainerName
. Его значение по умолчанию - через локализацию.
Добавить для Get-ADPrinter
поддержку для Identity
имени принтера.
Теперь пора приступать к:
И, на сладкое, - необходимо изменять параметры безопасности на самой очереди печати. Вижу два варианта выхода из положения:
Второй вариант мне кажется более правильным. И более гибким. И позволит предоставить доступ к очереди печати и в случае временной недоступности контроллеров домена.
В итоге - идём по второму варианту.
Долго думал над наименованиями функций.
Get-ADPrintQueueGroup
, New-ADPrintQueueGroup
, Update-ADPrintQueueGroup
New-ADPrintQueueGroup
готова, теперь Get
и Update
.
Для Update
есть как раз смысл предусмотреть флаг Force
для принудительного создания групп в случае их отсутствия.
При создании GPO следует подумать: возможно, при инициализации имеет смысл создать StarterGPO, с которого потом копировать GPO для каждой очереди печати. Такой вариант будет более гибким, как мне кажется...
Подключение принтера через GPO сценарием - не самое очевидное занятие. Затрагивает и file part, и ad part:
Использовать коммерческий модуль ради этой задачи мы не будем, сценарием поправим сами и AD part, и file part. При этом сначала попробую поправить только AD part, возможно - этого будет достаточно?
Подключение очереди печати через ad part и через file part GPO - два альтернативных пути. Первый мне нравится даже больше, но необходимо проверить, будет ли он работать без запуска pushprinterconnections.exe. Если да - будем использовать его, я думаю.
Второй путь так же не сложнее, но придётся создавать / изменять xml файл в file part GPO.
GPP (через file part) существенно гибче в настройках, безусловно. Пусть и сложнее, но склоняюсь к варианту публикации через GPP (через file part GPO).
Параметры, отвечающие за авторизацию, целесообразно удалить. Иначе вызовы тех же *-GPO
сильно усложнены будут. Если необходима явная авторизация - можно использовать сессии PowerShell. Предлагаю оставить только два параметра:
Server
- контроллер домена, на котором будем выполнять измененияDomain
- собственно домен, в котором будем выполнять необходимые нам действияDomainUtilsBase
- путь уже должен быть относительным по отношению к домену. По последнему параметру есть ряд вопросов. Целесообразнее решить вопрос с хранением параметров модуля в AD. Тогда последнего параметра не будет. Так что целесообразно предварительно решить вопрос с хранением параметров, на этом этапе - через инкапсуляцию в командлетах.
Есть неочевидные моменты. Например, для Get-ADPrintQueue
как "совместить" параметры Domain
и SearchBase
?
С другой стороны - а зачем совмещать? Никто не говорил, что мы должны "искать" очереди печати в том же домене, в котором будем создавать объекты GPO. Поэтому в указанном командлете параметра Domain
быть не должно. А в командлетах, отвечающих за GPO, - не будет SearchBase
, что логично.
Итак, работу с конфигурацией вынес в отдельный файл и командлеты, модуль заново отладил и сократил параметры благодаря конфигурации. И снова возвращаюсь к отладке создания GPO+GPP.
Итак, New-ADPrintQueueGPO
в первой редакции работает. Однако, есть проблемы с созданием GPLink. В контейнере (не OU) создать связь невозможно. Да и в консоли Управление групповой политикой видны будут только OU.
Так что пока вопрос, какого класса контейнеры использовать. Как минимум, при создании связей необходимо проверять класс и создавать связи только в OU.
Обеспечил поддержку для New-ADPrinterGPO
и класса контейнера OU с созданием ссылок на объекты политик в контейнерах очередей печати (только для OU).
Разумно и необходимо так же создавать ссылки на эти объекты сразу в некий OU, который будет являться "корневым" для размещения учётных записей наших пользователей и учётных записей наших ПК. Расположение этого OU необходимо сохранять в конфигурации. Создание данной ссылки разумно сделать опциональным, по флагу в параметрах командлета.
Добавил Get-ADPrintQueueGPO
.
Необходимо:
Initialize-ADPrintQueuesEnvironment
добавить -Force
(для переопределения аттрибутов существующего контейнера)Test-ADPrintQueuesEnvironment
Эти шаги необходимы для Update-ADPrintQueueEnvironment
(там же и New-*
, и Remove-*
). Этими командлетами основной функционал для принтеров завершим.
Дополнительный функционал:
И, естественно, необходимо всё подробно описать в readme.
P.S. Склоняюсь к целесообразности выделения ITG.DomainUtils в качестве самостоятельного модуля. Слишком уж они получаются ёмкими, в том числе и по описанию.
Всё-таки, целесообразно исключить контейнеры, создаваемые для каждого принтера. И name для групп, естественно, в этом случае потребуется изменить.
Убрал контейнеры, изменил имена групп.
Данный функционал выделен в отдельный модуль - https://github.com/IT-Service/ITG.DomainUtils.Printers
Описал
Get-ADPrintQueue
. К сожалению, не смог определить модульные тесты с помощью pester для этой функции, потому как при создании прокси функций для функций с несколькими наборами параметров посредствомопределения параметров не воспроизводятся вовсе.
Назначение
Get-ADPrintQueue
- обёртка вокругGet-ADObject
, по аналогии сGet-ADUser
.