Distribuzione di stampanti tramite GPO / GPP: esiste un'opzione programmatica?


10

Per motivi indipendenti dalla mia volontà, mi è stato affidato il compito di configurare GPO / GPP per distribuire le nostre oltre 100 stampanti ai nostri oltre 1000 clienti.

La buona notizia è che abbiamo oltre una dozzina di siti e, per la maggior parte, sono autorizzato a inviare tutte le stampanti nel sito X a tutti i PC client nel sito X.

La cattiva notizia è che i due modi in cui so come farlo ( "Distribuisci con criteri di gruppo ...", dal server di stampa " e usando GPP / Preferenze criteri di gruppo ) comportano un lavoro manuale notevolmente maggiore di quello che sono disposto a fare così tante stampanti. Non riesco nemmeno a selezionare tutte le stampanti su un server di stampa e utilizzare l' Deploy with Group Policy...opzione, ad esempio - mi aspetto che lo faccia uno per uno, il che non accadrà. I GPP sono anche peggio , poiché mi aspetto di selezionare il percorso di una stampante dal server di stampa e quindi inserire manualmente un sacco di informazioni (come l'IP della stampante) che dovrebbe essere in grado di ottenere dalla connessione della stampante.

Il mio Google-Fu per uno script per aggiungere tutte le stampanti su un server di stampa a un oggetto Criteri di gruppo / GPP è risultato vuoto e non riesco a vedere un altro modo per farlo anche in modo semi-automatizzato, ma sto attaccando con la convinzione che mi manchi qualcosa, perché non c'è modo che una persona sana di mente scelga di aggiungere manualmente centinaia di stampanti agli oggetti Criteri di gruppo.

Idealmente, vorrei trovare un modo programmatico per utilizzare i GPP, ma date le circostanze, qualsiasi soluzione che non implichi dozzine di ore con l'aggiunta manuale di stampanti sarebbe semplicemente fantastica.

Qualcuno ha un modo per farlo, o avrò bisogno di creare uno script PowerShell e / o indurre un subordinato a farlo?


1
Come ti ho già detto nella chat di oggi, esiste un'interfaccia COM per la creazione e il collegamento programmatico di oggetti Criteri di gruppo ... tutto a partire da qualcosa del genere $GPM = New-Object -ComObject GPMgmt.Gpm. Penso che quell'interfaccia, pur essendo un maiale assoluto con cui lavorare, potrebbe fornirti un metodo leggermente più sostenibile che semplicemente hackerare un po 'di XML che appare e odora come un vero oggetto Criteri di gruppo. A nessuno piace COM però. Meno di tutti noi Powershellers.
Ryan Ries,

1
@RyanRies Sì, lo sto ancora prendendo a calci nella mia mente, e una delle cose su cui non ho deciso è se il mio script deve essere sopportabile o solo una volta per impostarlo nel primo posto. Abbastanza sicuro che lo posterò qui, qualunque cosa finisca per fare.
HopelessN00b

Quando dici che devi distribuire 100 stampanti, non intendi dire che tutti i computer (1..1000) dovrebbero avere tutte e 100 le stampanti, giusto?
Adil Hindistan,

1
@AdilHindistan No. Ogni computer dovrebbe avere tutte le stampanti disponibili sul proprio sito. (Più o meno.) Ma separarli non è la parte difficile. Sta portando gli stampatori negli oggetti Criteri di gruppo in primo luogo che si sta rivelando più doloroso di quanto pensi che dovrebbe essere.
HopelessN00b

Risposte:


7

Ho cercato su Google abbastanza duramente, e ho anche giocato con la backup-GPOsperanza di poter hackerare il file XML risultante e reimportarlo, ma sospetto che uno script di PowerShell sia nel tuo futuro.

Non è così male. È possibile generare l'elenco delle stampanti dal server più vicino, quindi scorrere in sequenza e mapparle.

Qualcosa come questo:

$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)
}

Se le stampanti sono denominate cose logiche e esiste un modo logico per identificare le macchine, potresti essere in grado di perfezionarle maggiormente. Per esempio, utilizzavo il server più vicino in base al richiamo dell'indirizzo IP del client. Se l'indirizzo IP è 10.20. *, Vai al server1. Eccetera.

Spero che aiuti.

Modificare:

Guardando la documentazione di @ EvanAnderson, sono abbastanza sicuro che XML sia hackerabile.

Bit rilevante del mio file esportato (con redazioni):

<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>

È una buona risposta (e potrei finire per usare qualcosa del genere per rispettare alcune delle nostre scadenze), ma sospetto che uno stagista o un subordinato sia nel futuro di questa domanda, in realtà, poiché ci viene richiesto di usare GPO / GPP per assegnare stampanti ad un certo punto. E mentre uno script di accesso a PS si adatterebbe tecnicamente a tale requisito, mi aspetto che il management mi meriti abbastanza da non valere la pena farlo in quel modo.
HopelessN00b,

Ahimè. :( I cmdlet PowerShell GPO sembrano eseguire il backup, il ripristino, la creazione di oggetti vuoti ... ma non l'aggiunta agli oggetti Criteri di gruppo. Gli oggetti XML che hanno i criteri della stampante sembrano completamente hackerabili tranne il GUID.
Katherine Villyard

1
Sì, senza strumenti di terze parti, l'automazione GPO / GPP tramite PowerShell è piuttosto dolorosa. Ho trovato qualcosa che sembra abbastanza buono , tranne per il fatto che richiede una suite di software di terze parti che probabilmente non ci sarà permesso di acquistare ... quindi sarà probabilmente uno script come il tuo a modificare l'XML in un sito specifico Oggetti Criteri di gruppo ... che immagino pubblicherò qui una volta terminato.
HopelessN00b,

8

La gestione Powershell dei Criteri di gruppo fa schifo senza prodotti (commerciali) di terze parti, secondo me.

Penso che tu sia bloccato a correre attraverso l'XML (o in HTML se preferisci ) in Oggetti Criteri di gruppo per fare quello che stai cercando.

Fortunatamente l'XML non sembra così terrificante . Il valore UID per stampante (che credo sia quello a cui @KatherineVillyard si riferisce nel suo commento) è solo un GUID casuale generato per ogni stampante a cui fa riferimento l'XML.

Ecco un po 'di codice Powershell di esempio, modellato senza vergogna sul codice di Katherine:

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

(Scrivo codice Powershell davvero brutto.)

In realtà non ho provato a far analizzare questo XML da GPP CSE. L'XML viene convalidato, almeno.

Sto iniziando a pensare di scrivere un po 'di mostruosità usando Get-GPOe analizzando il GUID per arrivare al percorso del filesystem per l'oggetto Criteri di gruppo in SYSVOL ma, dato che stasera devo fare un po' di lavoro, penso che me ne andrò che come esercizio per il lettore. > smile <Dovrebbe essere altamente fattibile, però.


Se è un GUID casuale, è sicuramente hackerabile. Ho appena aggiornato anche il mio. Eh.
Katherine Villyard,

Modificare l'XML in un backup di Criteri di gruppo funzionerebbe sicuramente, ma anche modificarlo "live" in SYSVOL dovrebbe essere fattibile (a condizione che uno sia coraggioso, stupido o, come me, entrambi). Dal momento che ho un vero lavoro da svolgere stasera (e dato che sono tornato su @ewwhite per le classifiche di ripetizione di questo trimestre) penso che salverò caricando quella particolare pistola e puntandola ai loro piedi per qualcun altro. > risatina <
Evan Anderson,

Sono coraggioso, ma non sono così coraggioso. ;) Genera file, prova importandolo in ambiente di test, ecc.
Katherine Villyard,

2
Powershell ha davvero bisogno di più opzioni di oggetti Criteri di gruppo. Get-Link, Set-Link, New-GPO e Set-GPORegistry non sono abbastanza buoni ...
Mark Henderson,

I comandi integrati di PowerShell a volte non sono sufficienti. In tal caso, suggerirei di esaminare le soluzioni di "The GPO Guy". Ha una compagnia: sdmsoftware.com
Adil Hindistan,

0

Recentemente ho intrapreso un progetto simile e dopo aver esaminato il vecchio metodo push GPO rispetto al più recente GPP rispetto allo scripting, ho scelto per lo scripting tutto. Non ho idea di cosa funzioni meglio per te, ma qui ci sono un paio di suggerimenti per te:

  • Utilizzare idealmente un client con un nuovo sistema operativo (Windows 8/2012 +) per connettersi ai server di stampa e ottenere informazioni sulla stampante dai server di stampa:

    Get-Printer -computer PrintServerName

  • Utilizzare i gruppi di sicurezza AD per mappare le code di stampa sui computer. Supponiamo quindi di avere una coda di stampa (raccolta dal comando precedente) denominata \ PrintServer1 \ MyColorPrinter123, creare un gruppo di sicurezza come printer.group.PrintServer1.MyColorPrinter123 e aggiungere i computer a quel gruppo

  • Nello script di avvio, disporre di una funzione per verificare l'appartenenza al gruppo del computer quando viene visualizzato e vedere se fa parte di qualsiasi gruppo di stampanti. In tal caso, utilizzare i comandi printui.exe (o printui.dll) incorporati per mappare la stampante in questo modo

    Invoke-Expression 'rundll32 printui.dll, PrintUIEntry / ga / n "\ PrintServer1 \ MyColorPrinter123" / q'

  • Una volta che il computer è acceso, quel servizio di spooler di stampa invierà la "connessione di stampa", che era ciò che facevano gli oggetti Criteri di gruppo, a qualsiasi utente che accederà.

Puoi andare molto più dettagliato ** ma ad un livello elevato è quello che serve.

** Ho creato una GUI che consente agli utenti (tecnici) di scegliere qualsiasi server di stampa e fornisce loro un elenco di stampanti su quel server. Se ne scelgono uno, possono vederne tutte le proprietà. Queste informazioni provengono da Get-Printer che ho menzionato sopra. Se si esportano tali dati come CSV, è possibile riutilizzarli per visualizzare informazioni.

** I tecnici utilizzano quella GUI per inviare una richiesta per aggiungere un computer alle stampanti che si suppone debba connettersi. Questa è una 'richiesta', b / c non hanno autorizzazioni in AD.

** Un semplice script back-end controlla la cartella e aggiunge il computer al gruppo di stampanti che ho citato sopra. Quindi, se sai già chi dovrebbe ottenere quale stampante, bene, puoi facilmente farlo. L'aggiunta di computer ai gruppi è un lavoro semplice con i cmdlet di annunci.

** È inoltre possibile pianificare un lavoro per controllare i server di stampa per vedere se ci sono nuove code di stampa e confrontarli con i gruppi AD.

Quindi, creare una soluzione "gestita" è un po 'complicato, ma è facile iniziare con le basi e continuare ad aggiungere per avere un sistema molto flessibile e facile da usare che non coinvolga gli oggetti Criteri di gruppo ... solo un po' PowerShell

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.