Развертывание принтеров через GPO / GPP - есть ли программная опция?

10

По независящим от меня причинам мне было поручено настроить GPO / GPP для развертывания наших более 100 принтеров на наших более 1000 клиентов.

Хорошей новостью является то, что у нас более десятка сайтов, и по большей части мне разрешено распространять все принтеры на сайте X на все клиентские ПК на сайте X.

Плохая новость заключается в том, что два способа, которыми я знаю, как это сделать ( «Развертывание с групповой политикой ...», с сервера печати » и использование настроек GPP / групповой политики ), требуют гораздо больше ручной работы, чем я готов для так много принтеров. Я даже не могу выбрать все принтеры на сервере печати и использовать Deploy with Group Policy...опцию, например - он ожидает, что я сделаю это один за другим, чего не произойдет. GPP еще хуже , поскольку он ожидает, что я выберу путь принтера с сервера печати, а затем вручную введу кучу информации (например, IP-адрес принтера), которую он сможет получить из соединения с принтером.

Мой Google-Fu для сценария добавления всех принтеров на сервере печати в GPO / GPP оказался пустым, и я не вижу другого способа сделать это даже полуавтоматическим способом, но я придерживаюсь с верой в то, что я что-то упустил, потому что ни один здравомыслящий человек ни за что не выбрал бы ручное добавление сотен принтеров в объекты групповой политики.

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

У кого-нибудь есть способ сделать это, или мне нужно будет создать сценарий PowerShell и / или обмануть подчиненного в этом?

HopelessN00b
источник
1
Как я уже говорил вам сегодня в чате, есть интерфейс COM для программного создания и связывания объектов групповой политики ... все начинается с чего-то вроде $GPM = New-Object -ComObject GPMgmt.Gpm. Я думаю, что этот интерфейс, хотя и является абсолютной свиньей для работы, может предоставить вам немного более приемлемый метод, чем просто взломать какой-нибудь XML, который выглядит и пахнет как настоящий GPO. Никто не любит COM, хотя. Меньше всего мы Пауэршеллеры.
Райан Райс
1
@RyanRies Да, я все еще думаю об этом, и одна из вещей, о которых я не решил, это необходимость поддержки моего сценария или единовременная настройка его в первое место. Я уверен, что я опубликую это здесь, что бы я ни делал.
HopelessN00b
Когда вы говорите, что вам нужно развернуть 100 принтеров, вы не имеете в виду, что на всех компьютерах (1..1000) должны быть все 100 принтеров, верно?
Адиль Хиндистан
1
@AdilHindistan Нет. Каждый компьютер должен получить все принтеры, доступные на его сайте. (Более или менее.) Но разделение их не самая сложная часть. Прежде всего, это приводит принтеры в объекты групповой политики, и это оказывается более болезненным, чем вы думаете.
HopelessN00b

Ответы:

7

Я довольно сильно погуглил и даже поиграл backup-GPOв надежде, что смогу взломать результирующий XML-файл и повторно импортировать его, но я подозреваю, что сценарий PowerShell находится в вашем будущем.

Это не так уж плохо. Вы можете сгенерировать список принтеров с ближайшего сервера, а затем просмотреть их и отобразить их.

Что-то вроде этого:

$net = New-Object -COMObject WScript.Network
$printserver = 'yourserver'

$printerlist = Get-WMIObject -class Win32_Printer -computer $printserver | Where-Object {$_.ShareName -ne $null} | Select-Object ShareName
foreach ($printer in $printerlist) 
{
    $printerpath = '\\' + $printserver + '\' + $printer.ShareName
    #echo $printerpath
    $net.AddWindowsPrinterConnection($printerpath)
}

Если принтеры названы логическими вещами, и есть какой-то логический способ идентифицировать машины, вы могли бы улучшить его. Я использовал для выбора ближайшего сервера, например, на основе подтягивания IP-адреса клиента. Если IP-адрес, например, 10.20. *, Перейдите на сервер1. И т.п.

Надеюсь, это поможет.

Редактировать:

Глядя на документацию @ EvanAnderson, я почти уверен, что XML можно взломать.

Соответствующий бит моего экспортированного файла (с изменениями):

<DSObject bkp:Path="CN={GUIDHERE},CN=PushedPrinterConnections,%GPO_MACH_DSPATH%" bkp:SourceExpandedPath="CN={13B9B596-452C-4652-A05D-78EF06610134},CN=PushedPrinterConnections,CN=Machine,CN={44A99FBA-0DB3-484C-808E-3DDAE9932A2B},CN=Policies,CN=System,DC=Domainname,DC=extension" bkp:ObjectClass="msPrint-ConnectionPolicy">
    <DSAttributeMultiString bkp:DSAttrName="showInAdvancedViewOnly">
        <DSValue><![CDATA[TRUE]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="uNCName">
        <DSValue><![CDATA[\\Servername\PrinterShareName]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="serverName">
        <DSValue><![CDATA[\\Servername]]></DSValue></DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="printAttributes">
        <DSValue><![CDATA[0]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="printerName">
        <DSValue><![CDATA[PrinterShareName]]></DSValue>
    </DSAttributeMultiString>
</DSObject>
Кэтрин Вилляр
источник
Это хороший ответ (и я мог бы в конечном итоге использовать что-то вроде этого, чтобы уложиться в некоторые из наших сроков), но я подозреваю, что стажер или подчиненный находится в будущем этого вопроса, на самом деле, так как мы должны использовать GPO / GPP для назначения принтеры в какой-то момент. И хотя сценарий входа в систему PS технически соответствовал бы этому требованию, я ожидаю, что руководство получит достаточную поддержку, чтобы сделать это таким образом.
HopelessN00b
Увы. :( Командлеты PowerShell для объектов групповой политики, похоже, выполняют резервное копирование, восстановление, создание пустых объектов ... но не добавляют к объектам групповой политики. Объекты XML с политиками принтера выглядят полностью взломанными, за исключением GUID.
Кэтрин Виллиард,
1
Да, без сторонних инструментов автоматизация GPO / GPP через PowerShell довольно болезненна. Я нашел кое-что, что выглядит довольно неплохо , за исключением того факта, что для этого требуется сторонний программный пакет, который нам, вероятно, не позволят покупать ... так что, вероятно, будет какой-то сценарий, подобный вашему, для редактирования XML в существующем для конкретного сайта GPO ... которые, я думаю, я опубликую здесь, как только закончу.
HopelessN00b
8

По моему мнению, управление групповой политикой в ​​Powershell - это отстой без сторонних (коммерческих) продуктов.

Я думаю, что вы застряли, просматривая XML (или HTML, если хотите ) в объектах групповой политики, чтобы делать то, что вы ищете.

К счастью, XML выглядит не так страшно . Значение UID для каждого принтера (которое, как мне кажется, @KatherineVillyard ссылается в своем комментарии) - это просто случайный GUID, сгенерированный для каждого принтера, на который есть ссылка в XML.

Вот пример кода Powershell, беззастенчиво смоделированный по примеру кода Кэтрин:

@"
<?xml version="1.0" encoding="utf-8"?>
<Printers clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}" disabled="0">
"@

$net = New-Object -COMObject WScript.Network
$printserver = 'print-server'

$printerlist = Get-WMIObject -class Win32_Printer -computer $printserver | Where-Object {$_.ShareName -ne $null} | Select-Object ShareName
foreach ($printer in $printerlist) 
{
    $date = Get-Date
    echo '  <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}"'
    '    name="' + $printer.ShareName + '"' | echo
    '    status="' + $printer.ShareName + '"' | echo
    echo '    image="2"'
    '    changed="' + $date + '"' | echo
    $ng = [GUID]::NewGuid().ToString('B')
    '    uid="' + $ng + '">' | echo

    echo '    <Properties'
    echo '      action="R"'
    echo '      comment=""'
    '      path="\\' + $printserver + '\' + $printer.ShareName + '"' | echo
    echo '      location=""'
    echo '      default="1"' 
    echo '      skipLocal="1"'
    echo '      deleteAll="0"'
    echo '      persistent="0"'
    echo '      deleteMaps="0"'
    echo '      port=""/>'
    echo '  </SharedPrinter>'
}

@"
</Printers>
"@

(Я пишу действительно ужасный код Powershell.)

На самом деле я не пытался заставить GPP CSE анализировать этот XML. XML действительно проверяет, по крайней мере.

Я начинаю думать о том, чтобы написать какое-то чудовище, используя Get-GPOи анализируя GUID, чтобы найти путь к файловой системе для объекта групповой политики в SYSVOL, но, учитывая, что мне нужно сделать какую-то реальную работу этим вечером, я думаю, что я уйду это как упражнение для читателя. > улыбка <Это должно быть очень выполнимо, хотя.

Эван Андерсон
источник
Если это случайный GUID, он определенно взломан. Я тоже обновил свой тоже. Хех.
Кэтрин Вилльярд
Изменение XML в резервном копировании групповой политики, безусловно, будет работать, но изменение его «живого» в SYSVOL также должно быть осуществимо (при условии, что один из них - смелый, глупый или, как я, оба). Так как у меня есть настоящая работа этим вечером (и так как я снова вернулся на @ewwhite для рейтинга представителей в этом квартале), я думаю, я сэкономлю, загружая это конкретное оружие и направляя его на ноги для кого-то другого. > хихикать <
Эван Андерсон
Я смелый, но я не такой смелый. ;) Создание файла, тестирование импорта в тестовой среде и т. Д.
Кэтрин Вилльярд
2
Powershell действительно нуждается в большем количестве параметров GPO. Get-Link, Set-Link, New-GPO и Set-GPORegistry не достаточно хороши ...
Марк Хендерсон
Встроенных команд PowerShell иногда недостаточно. В этом случае я бы посоветовал взглянуть на «Решения GPO Guy». У него есть компания: sdmsoftware.com
Adil Hindistan
0

Недавно я предпринял аналогичный проект, и после изучения хорошего старого метода GPO push, нового GPP и сценариев я выбрал весь сценарий. Я понятия не имею, что будет работать лучше для вас, но вот пара указателей для вас:

  • В идеале используйте клиент с новой ОС (Windows 8/2012 +) для подключения к серверам печати и получения информации о принтере с серверов печати:

    Get-Printer -компьютер PrintServerName

  • Используйте группы безопасности AD для сопоставления очередей печати с компьютерами. Допустим, у вас есть очередь печати (вы собрали из приведенной выше команды) с именем \ PrintServer1 \ MyColorPrinter123, создайте группу безопасности, такую ​​как printer.group.PrintServer1.MyColorPrinter123, и добавьте компьютеры в эту группу.

  • В сценарии запуска есть функция для проверки членства в группах компьютера, когда он запускается, и определения, входит ли он в какие-либо группы принтеров. Если это так, используйте встроенные команды printui.exe (или printui.dll) для сопоставления принтера следующим образом.

    Вызвать выражение 'rundll32 printui.dll, PrintUIEntry / ga / n "\ PrintServer1 \ MyColorPrinter123" / q'

  • Как только компьютер включится, эта служба диспетчера очереди печати будет выдавать «подключение к печати», как это обычно делали объекты групповой политики, любому пользователю, который собирается войти в систему.

Вы можете пойти намного более подробно **, но на высоком уровне это то, что нужно.

** Я создал графический интерфейс, который позволяет пользователям (на самом деле техническим специалистам) выбирать любой сервер печати, и он предоставляет им список принтеров на этом сервере. Если они выберут один, они смогут увидеть все его свойства. Эта информация взята из Get-Printer, о котором я упоминал выше. Если вы экспортируете эти данные в формате CSV, вы можете использовать их для отображения информации.

** Специалисты используют этот графический интерфейс для отправки запроса на добавление компьютера к принтерам, к которым он должен подключаться. Это «запрос», т.к. у них нет разрешений в AD.

** Простой бэкэнд-скрипт следит за папкой и добавляет компьютер в группу принтеров, о которой я упоминал выше. Так что, если вы уже знаете, кто должен получить какой принтер, отлично, вы можете легко это сделать. Добавление компьютеров в группы - это простая работа с командлетами AD.

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

Итак, создание «управляемого» решения немного сложнее, но его легко начать с основ и продолжать добавлять, чтобы иметь очень гибкую, простую в использовании систему, не требующую использования объектов групповой политики ... просто немного PowerShell

Адиль Хиндистан
источник