Розгортання принтерів через 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.