Обычно не проблема вообще. Вам все еще будет нужен менеджер по подсети, работающий на одном из них (как OSM от стека OFED).
Я довольно усердно гуглил и даже играл с 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. *, Перейдите на server1. И т.д.
Надеюсь, что это поможет.
Изменить:
Глядя на документацию @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>
Управление групповой политикой 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, но, учитывая, что мне нужно поработать сегодня вечером, я думаю, что оставлю это в качестве упражнения для читателя. > smile <Хотя это должно быть вполне осуществимо.
Недавно я предпринял аналогичный проект и, изучив старый добрый метод проталкивания GPO по сравнению с новым GPP и скриптингом, я выбрал для написания всего этого скрипта. Я понятия не имею, что подойдет вам лучше всего, но вот пара указателей:
В идеале используйте клиент с новой ОС (Windows 8/2012 +) для подключения к серверам печати и получения информации о принтере с серверов печати. :
Get-Printer -computer PrintServerName
Используйте группы безопасности AD для сопоставления очередей печати компьютерам. Предположим, у вас есть очередь печати (вы собрали из приведенной выше команды) с именем \ PrintServer1 \ MyColorPrinter123, создайте группу безопасности, например, printer.group.PrintServer1.MyColorPrinter123, и добавьте компьютеры в эту группу
В сценарии запуска укажите функция проверки членства компьютера в группах, когда он появляется, и посмотрите, входит ли он в какую-либо группу принтеров. Если это так, используйте встроенные команды printui.exe (или printui.dll) для сопоставления принтера следующим образом
Invoke-Expression 'rundll32 printui.dll, PrintUIEntry / ga / n "\ PrintServer1 \ MyColorPrinter123" / q '
После того, как компьютер включится, эта служба диспетчера очереди печати подтолкнет «подключение для печати», что и делали GPO, любому пользователю, который собирается войти в систему.
Вы можете перейти к более подробному ** но на высоком уровне это то, что нужно.
** Я создал графический интерфейс, который позволяет пользователям (на самом деле техническим специалистам) выбирать любой сервер печати, и он дает им список принтеров на этом сервере. Если они выберут что-то одно, то увидят все его свойства. Эта информация поступает от Get-Printer, о котором я упоминал выше. Если вы экспортируете эти данные в формате CSV, вы можете повторно использовать их для отображения информации.
** Специалисты используют этот графический интерфейс для отправки запроса на добавление компьютера к принтерам, к которым он должен подключаться. Это «запрос», т.к. у них нет разрешений в AD.
** Простой внутренний скрипт наблюдает за папкой и добавляет компьютер в группу принтеров, о которой я упоминал выше. Итак, если вы уже знаете, кому и какой принтер следует достать, отлично, вы можете легко это сделать. Добавление компьютеров в группы - простое задание с помощью командлетов AD.
** Вы также можете запланировать задание на проверку серверов печати, чтобы увидеть, есть ли новые очереди печати, и сравнить их с вашими группами AD.
Итак, создание «управляемого» решения - это немного сложно, но легко начать с основ и продолжать добавлять, чтобы получить очень гибкую, простую в использовании систему, которая не включает объекты групповой политики ... немного PowerShell
** Простой внутренний скрипт наблюдает за папкой и добавляет компьютер в группу принтеров, о которой я упоминал выше. Итак, если вы уже знаете, кому и какой принтер следует достать, отлично, вы можете легко это сделать. Добавление компьютеров в группы - простое задание с помощью командлетов AD.
** Вы также можете запланировать задание на проверку серверов печати, чтобы увидеть, есть ли новые очереди печати, и сравнить их с вашими группами AD.
Итак, создание «управляемого» решения - это немного сложная задача, но легко начать с основ и продолжать добавлять, чтобы получить очень гибкую и простую в использовании систему, которая не включает объекты групповой политики ... немного PowerShell
** Простой внутренний скрипт наблюдает за папкой и добавляет компьютер в группу принтеров, о которой я упоминал выше. Итак, если вы уже знаете, кому и какой принтер следует достать, отлично, вы можете легко это сделать. Добавление компьютеров в группы - простое задание с помощью командлетов AD.
** Вы также можете запланировать задание на проверку серверов печати, чтобы увидеть, есть ли новые очереди печати, и сравнить их с вашими группами AD.
Итак, создание «управляемого» решения - это немного сложная задача, но легко начать с основ и продолжать добавлять, чтобы получить очень гибкую и простую в использовании систему, которая не включает объекты групповой политики ... немного PowerShell
Добавление компьютеров в группы - простое задание с помощью командлетов AD.** Вы также можете запланировать задание на проверку серверов печати, чтобы увидеть, есть ли новые очереди печати, и сравнить их с вашими группами AD.
Итак, создание «управляемого» решения - это немного сложная задача, но легко начать с основ и продолжать добавлять, чтобы получить очень гибкую и простую в использовании систему, которая не включает объекты групповой политики ... немного PowerShell
Добавление компьютеров в группы - простое задание с помощью командлетов AD.** Вы также можете запланировать задание на проверку серверов печати, чтобы увидеть, есть ли новые очереди печати, и сравнить их с вашими группами AD.
Итак, создание «управляемого» решения - это немного сложная задача, но легко начать с основ и продолжать добавлять, чтобы получить очень гибкую и простую в использовании систему, которая не включает объекты групповой политики ... немного PowerShell