Розгортання принтерів через GPO / GPP - чи є програмний варіант?


10

З причин, що не знаходяться під моїм контролем, мені було доручено налаштувати GPO / GPP для розміщення наших 100+ принтерів для наших 1000+ клієнтів.

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

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

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

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

Хтось має спосіб це зробити, чи мені потрібно буде створити сценарій PowerShell та / або обдурити підлеглого робити це?


1
Як я вже згадував вам у чаті раніше, є COM-інтерфейс для програмного створення та зв’язку групових організацій ... все починається з чогось подібного $GPM = New-Object -ComObject GPMgmt.Gpm. Я думаю, що цей інтерфейс, будучи абсолютною свинею для роботи, може запропонувати вам трохи прихильніший метод, ніж просто зламати якийсь XML, який виглядає і пахне справжнім GPO. Хоча ніхто не любить COM. Найменше ми, державники влади.
Ryan Ries

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

На жаль :( Командлети командних панелей GPO, схоже, створюють резервну копію, відновлюють, створюють порожні об'єкти ..., але не додають до GPO. Об'єкти XML, які мають поліграфіку принтера, виглядають абсолютно руйнуючими, за винятком GUID.
Кетрін Вільярд,

1
Так, без сторонніх інструментів автоматизація GPO / GPP через PowerShell є досить болючою. Я знайшов щось, що виглядає досить добре , за винятком того, що для нього потрібен сторонній програмний пакет, який, ймовірно, нам не дозволять купувати ... тому, ймовірно, буде якийсь сценарій, як ваш, для редагування XML у існуючих для конкретного сайту ГПО ... які я думаю, я опублікую тут, коли закінчу.
HopelessN00b

8

Потужність управління груповою політикою висмоктує без сторонніх (комерційних) продуктів, на мою думку.

Думаю, ви застрягли в строках через XML (або в HTML, якщо вам зручніше ) в об'єктах групової політики, щоб робити те, що вам потрібно.

На щастя, XML не виглядає так жахливо . Значення UID для кожного принтера (на який я вважаю, на яке посилається @KatherineVillyard) - це лише випадковий GUID, сформований для кожного принтера, на який посилається XML.

Ось декілька зразків коду Пауершелла, що безсоромно моделюється за кодом Кетрін:

@"
<?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.)

Я насправді не намагався GPE CSE розібрати цей XML. XML дійсно підтверджує, щонайменше.

Я починаю замислюватися над тим, щоб написати деяку жахливість, використовуючи Get-GPOта розібравши GUID, щоб дістатися до шляху файлової системи для GPO в SYSVOL, але, враховуючи, що сьогодні потрібно виконати справжню роботу, я думаю, я збираюся піти що як вправа для читача. > усмішка <Хоча це має бути дуже здійсненно.


Якщо це випадковий GUID, його, безумовно, можна зламати. Я теж оновив свою. Хе.
Кетрін Вільярд

Зміна XML в резервному режимі групової політики, безумовно, спрацює, але змінити його "наживо" в SYSVOL також повинно бути можливим (за умови, що він або сміливий, дурний, або, як я, обидва). Оскільки в цей вечір я маю справжню роботу (і оскільки я знову перестав @ewwhite за рейтинг реп в цій чверті), я думаю, що я врятую завантаження саме цього пістолета і вкажу його в ноги на когось іншого. > giggle <
Еван Андерсон

Я хоробрий, але я не такий сміливий. ;) Створення файлу, тест імпорту його у тестовому середовищі тощо
Кетрін Вільярд

2
Powershell дійсно потребує більше варіантів GPO. Get-Link, Set-Link, New-GPO та Set-GPORegistry не дуже хороші ...
Марк Хендерсон

Вбудованих команд PowerShell іноді недостатньо. У такому випадку я б запропонував поглянути на рішення «ГПУ хлопця». У нього є компанія: sdmsoftware.com
Аділ Хіндістан

0

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

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

    Get-Printer -комп'ютер 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 Cmdlets.

** Ви також можете запланувати завдання, щоб перевірити сервери друку, щоб побачити, чи є нові черги друку, і порівняти їх з вашими групами AD.

Отже, створення "керованого" рішення дещо задіяне, але легко почати з основ і продовжувати додавати, щоб мати дуже гнучку, просту у використанні систему, яка не передбачає участі в GPO ... просто трохи PowerShell

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.