Bereitstellen von Druckern über GPO / GPP - Gibt es eine programmatische Option?

10

Aus Gründen, die außerhalb meiner Kontrolle liegen, wurde ich mit der Einrichtung von Gruppenrichtlinienobjekten / Gruppenrichtlinienobjekten beauftragt, um unsere über 100 Drucker für unsere über 1000 Kunden bereitzustellen.

Die gute Nachricht ist, dass wir über ein Dutzend Standorte haben, und zum größten Teil darf ich alle Drucker am Standort X auf alle Client-PCs am Standort X übertragen.

Die schlechte Nachricht ist, dass die beiden Methoden, die ich kenne ( "Mit Gruppenrichtlinien bereitstellen ...", vom Druckserver " und Verwenden der GPP- / Gruppenrichtlinieneinstellungen ), erheblich mehr manuelle Arbeit erfordern, als ich bereit bin so viele Drucker. Ich kann nicht einmal alle Drucker auf einem Druckserver auswählen und Deploy with Group Policy...zum Beispiel die Option verwenden - es wird erwartet, dass ich das einzeln mache, was nicht passieren wird. Die GPPs sind noch schlimmer Es wird erwartet, dass ich den Pfad eines Druckers vom Druckserver aus auswähle und dann manuell eine Reihe von Informationen (z. B. die IP-Adresse des Druckers) eingebe, die über die Druckerverbindung abgerufen werden sollen.

Mein Google-Fu für ein Skript zum Hinzufügen aller Drucker auf einem Druckserver zu einem Gruppenrichtlinienobjekt / Gruppenrichtlinienobjekt war leer, und ich sehe keinen anderen Weg, dies auch nur halbautomatisch zu tun, aber ich bleibe dabei mit der Überzeugung, dass mir etwas fehlt, weil es keine vernünftige Person gibt, die Hunderte von Druckern manuell zu Gruppenrichtlinienobjekten hinzufügt.

Idealerweise möchte ich einen programmatischen Weg finden, um die GPPs zu verwenden, aber unter diesen Umständen wäre jede Lösung, bei der nicht Dutzende von Stunden manuell Drucker hinzugefügt werden, einfach großartig.

Hat jemand eine Möglichkeit, dies zu tun, oder muss ich ein PowerShell-Skript erstellen und / oder einen Untergebenen dazu verleiten?

HopelessN00b
quelle
1
Wie ich Ihnen heute im Chat bereits erwähnt habe, gibt es eine COM-Oberfläche zum programmgesteuerten Erstellen und Verknüpfen von Gruppenrichtlinienobjekten $GPM = New-Object -ComObject GPMgmt.Gpm. Ich denke, dass die Benutzeroberfläche, obwohl sie ein absolutes Schwein ist, mit dem Sie arbeiten können, Ihnen eine etwas unterstützendere Methode bietet, als nur XML zu hacken, das wie ein echtes Gruppenrichtlinienobjekt aussieht und riecht. Niemand mag COM. Am allerwenigsten wir Powersheller.
Ryan Ries
1
@RyanRies Ja, ich mache mir immer noch Gedanken darüber, und eines der Dinge, über die ich mich noch nicht entschieden habe, ist, ob mein Scrip unterstützt werden muss oder nicht, oder nur eine einmalige Sache, um es im Internet einzurichten erster Platz. Ich bin mir ziemlich sicher, dass ich es hier posten werde, was auch immer ich am Ende tue.
HopelessN00b
Wenn Sie sagen, dass Sie 100 Drucker bereitstellen müssen, bedeutet dies nicht, dass alle Computer (1..1000) alle 100 Drucker haben sollten, oder?
Adil Hindistan
1
@AdilHindistan Nein. Jeder Computer sollte alle an seinem Standort verfügbaren Drucker erhalten. (Mehr oder weniger.) Aber sie zu trennen ist nicht der schwierige Teil. Es bringt die Drucker in erster Linie in Gruppenrichtlinienobjekte, was sich als schmerzhafter herausstellt, als Sie denken sollten.
HopelessN00b

Antworten:

7

Ich habe ziemlich hart gegoogelt und sogar backup-GPOin der Hoffnung gespielt, die resultierende XML-Datei hacken und erneut importieren zu können, aber ich vermute, dass ein PowerShell-Skript in Ihrer Zukunft liegt.

Ist doch nicht so schlimm. Sie können die Druckerliste vom nächstgelegenen Server generieren und diese dann durchlaufen und zuordnen.

Etwas wie das:

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

Wenn die Drucker als logische Elemente bezeichnet werden und es eine logische Möglichkeit gibt, die Computer zu identifizieren, können Sie sie möglicherweise weiter verfeinern. Früher habe ich den nächstgelegenen Server ausgewählt, indem ich zum Beispiel die Client-IP-Adresse abgerufen habe. Wenn die IP-Adresse 10.20. * Ist, gehen Sie zu Server1. Etc.

Ich hoffe das hilft.

Bearbeiten:

Wenn ich mir die Dokumentation von @ EvanAnderson ansehe, bin ich mir ziemlich sicher, dass XML hackbar ist.

Relevantes Stück meiner exportierten Datei (mit Redaktionen):

<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>
Katherine Villyard
quelle
Es ist eine gute Antwort (und ich könnte am Ende so etwas verwenden, um einige unserer Fristen einzuhalten), aber ich vermute, dass ein Praktikant oder Untergebener in der Zukunft dieser Frage liegt, da wir GPOs / GPPs zum Zuweisen verwenden müssen Drucker irgendwann. Und obwohl ein PS-Anmeldeskript technisch zu dieser Anforderung passen würde, erwarte ich, dass das Management mich so stark belastet, dass es sich nicht lohnt, dies so zu tun.
HopelessN00b
Ach. :( Die PowerShell-Cmdlets des Gruppenrichtlinienobjekts scheinen zu sichern, wiederherzustellen, leere Objekte zu erstellen ... aber nicht zu Gruppenrichtlinienobjekten hinzuzufügen. Die XML-Objekte mit den Druckerrichtlinien sehen bis auf die GUID vollständig hackbar aus.
Katherine Villyard
1
Ja, ohne Tools von Drittanbietern ist die GPO / GPP-Automatisierung über PowerShell ziemlich schmerzhaft. Ich habe etwas gefunden, das ziemlich gut aussieht , abgesehen von der Tatsache, dass es eine Software-Suite eines Drittanbieters erfordert, die wir wahrscheinlich nicht kaufen dürfen. Es wird also wahrscheinlich ein Skript wie das Ihre sein, um das XML in vorhandenen Site-spezifischen zu bearbeiten Gruppenrichtlinienobjekte ... die ich mir vorstellen werde, hier zu posten, wenn ich fertig bin.
HopelessN00b
8

Das Powershell-Management von Gruppenrichtlinien ist meiner Meinung nach ohne (kommerzielle) Produkte von Drittanbietern zum Kotzen .

Ich denke, Sie stecken nicht mehr in XML (oder in HTML, wenn Sie es vorziehen ) in Gruppenrichtlinienobjekten, um das zu tun, wonach Sie suchen.

Glücklicherweise sieht das XML nicht so furchterregend aus . Der UID-Wert pro Drucker (auf den sich @KatherineVillyard in ihrem Kommentar meiner Meinung nach bezieht) ist nur eine zufällige GUID, die für jeden Drucker generiert wird, auf den in XML verwiesen wird.

Hier ist ein Beispiel für einen Powershell-Code, der schamlos dem Code von Katherine nachempfunden ist:

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

(Ich schreibe wirklich sehr, sehr hässlichen Powershell-Code.)

Ich habe nicht wirklich versucht, dass die GPP-CSE dieses XML analysiert. Das XML wird zumindest validiert.

Ich fange an darüber nachzudenken, eine Monstrosität zu schreiben, indem Get-GPOich die GUID verwende und analysiere, um zum Dateisystempfad für das Gruppenrichtlinienobjekt in SYSVOL zu gelangen, aber da ich heute Abend echte Arbeit leisten muss, denke ich, dass ich gehen werde das als Übung für den Leser. > lächeln <Es sollte jedoch durchaus machbar sein.

Evan Anderson
quelle
Wenn es sich um eine zufällige GUID handelt, ist sie definitiv hackbar. Ich habe gerade auch meine aktualisiert. Heh.
Katherine Villyard
Das Ändern des XML in einer Gruppenrichtliniensicherung würde sicherlich funktionieren, aber es sollte auch möglich sein, es in SYSVOL "live" zu ändern (vorausgesetzt, einer ist entweder mutig, dumm oder, wie ich, beides). Da ich heute Abend echte Arbeit zu erledigen habe (und da ich dieses Quartal wieder über @ewwhite für die Rep-Rangliste bin), denke ich, dass ich es mir sparen werde, diese bestimmte Waffe zu laden und sie für jemand anderen auf ihre Füße zu richten. > kichern <
Evan Anderson
Ich bin mutig, aber ich bin nicht so mutig. ;) Datei generieren, Test importieren in Testumgebung usw.
Katherine Villyard
2
Powershell benötigt wirklich mehr GPO-Optionen. Get-Link, Set-Link, New-GPO und Set-GPORegistry sind nicht gut genug ...
Mark Henderson
Integrierte PowerShell-Befehle reichen manchmal nicht aus. In diesem Fall würde ich vorschlagen, sich die Lösungen von 'The GPO Guy' anzuschauen. Er hat eine Firma: sdmsoftware.com
Adil Hindistan
0

Ich habe kürzlich ein ähnliches Projekt durchgeführt und nachdem ich mir die gute alte GPO-Push-Methode im Vergleich zu neuerem GPP im Vergleich zu Scripting angesehen hatte, entschied ich mich für das Scripting des Ganzen. Ich habe keine Ahnung, was für Sie am besten funktionieren würde, aber hier sind ein paar Hinweise für Sie:

  • Verwenden Sie im Idealfall einen Client mit einem neuen Betriebssystem (Windows 8/2012 +), um eine Verbindung zu Druckservern herzustellen und Druckerinformationen von Druckservern abzurufen:

    Get-Printer -computer PrintServerName

  • Verwenden Sie AD-Sicherheitsgruppen, um Druckwarteschlangen Computern zuzuordnen. Angenommen, Sie haben eine Druckwarteschlange (Sie haben den obigen Befehl erhalten) mit dem Namen \ PrintServer1 \ MyColorPrinter123, erstellen eine Sicherheitsgruppe wie Drucker.group.PrintServer1.MyColorPrinter123 und fügen die Computer dieser Gruppe hinzu

  • Verfügen Sie im Startskript über eine Funktion, mit der Sie die Gruppenmitgliedschaft des Computers beim Start überprüfen und feststellen können, ob er Teil einer Druckergruppe ist. Wenn dies der Fall ist, verwenden Sie die integrierten Befehle printui.exe (oder printui.dll), um den Drucker wie folgt zuzuordnen

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

  • Sobald der Computer hochgefahren ist, überträgt dieser Druckspooler-Dienst die 'Druckverbindung', wie sie von Gruppenrichtlinienobjekten verwendet wurde, an jeden Benutzer, der sich anmelden wird.

Sie können viel detaillierter gehen **, aber auf hohem Niveau ist es das, was es braucht.

** Ich habe eine GUI erstellt, mit der Benutzer (Techniker wirklich) einen beliebigen Druckserver auswählen können, und die ihnen eine Liste der Drucker auf diesem Server gibt. Wenn sie eine auswählen, können sie alle Eigenschaften davon sehen. Diese Informationen stammen von Get-Printer, den ich oben erwähnt habe. Wenn Sie diese Daten als CSV exportieren, können Sie sie erneut verwenden, um Informationen anzuzeigen.

** Techniker verwenden diese GUI, um eine Anforderung zum Hinzufügen eines Computers zu Druckern zu senden, die eine Verbindung herstellen sollen. Dies ist eine 'Anfrage', b / c sie haben keine Berechtigungen in AD.

** Ein einfaches Backend-Skript überwacht den Ordner und fügt den Computer der oben genannten Druckergruppe hinzu. Wenn Sie also bereits wissen, wer welchen Drucker bekommen soll, können Sie das ganz einfach tun. Das Hinzufügen von Computern zu Gruppen ist mit AD-Cmdlets eine einfache Aufgabe.

** Sie können auch einen Job planen, um die Druckserver auf neue Druckwarteschlangen zu überprüfen und diese mit Ihren AD-Gruppen zu vergleichen.

Das Erstellen einer "verwalteten" Lösung ist also ein bisschen kompliziert, aber es ist einfach, mit den Grundlagen zu beginnen und weitere hinzuzufügen, um ein sehr flexibles, benutzerfreundliches System zu haben, das keine Gruppenrichtlinienobjekte enthält ... nur ein bisschen PowerShell

Adil Hindistan
quelle