wbz-its
Goto Top

Netzwerkdrucker mappen anhand PC und Druckerliste

Hallo allerseits

Wir migrieren unsere IT Umgebung von veralteten Windows 7 PCs zu neuen Windows 10 PCs.

Im Hintergrund laufen bereits Server 2012R2 und teilweise 2016.

Aktuell werden die Druckermappings anhand eines KIX Script bewerkstellgt, welches auf eine .ini Datei zugreift
in welcher die PCs aufgelistet sind und welche Drucker sie erhalten sollen und welches dieser gemappten Drucker der Standard sein soll.

Das funktioniert soweit auch sehr gut, allerdings wollen wir in die neue Umgebung das KIX nicht mehr mitnehmen, bzw. wollen wir
möglichst alles (oder viel) mit GPOs, GPPs und PowerShell machen, im Extremfall VBS oder .bat.

Jetzt werden wohl viele sagen, wir sollen das Mapping mit GPOs/GPP machen, das haben wir auch schon angeschaut, jedoch wäre es für unsere
Umgebung nicht praktisch, bzw. zu komplex und würden unser Ziel nicht erreichen.

Wir betreuen ca. 180 PCs und ca. 70 Drucker, welche teilweise in Einzelbüros sind, oder die Mitarbeiter der gleichen Abteilung über diverse
Stockwerke und Büros verteilt sind, und dementsprechend unterschiedliche Drucker haben, und auch andere Geräte als Standard definiert sind.

Unser Wunsch wäre es nun, einen Login Script, vorzugsweise PowerShell, oder eins welches wir als GPO verteilen könnten zu erstellen,
das immer gleich bleibt, und wir nur die Liste der PCs und Drucker, bzw. welcher Drucker welchem PC zugewiesen ist bearbeiten müssten.

Klappere das Netz seit Tagen ab nach einer solchen Lösung, werde aber einfach nicht fündig, und kann mir nicht vorstellen, dass wir die Einzigen
sind mit solch einem Bedürfnis.

Wir sind natürlich auch für jeglichen anderen praktischen Ansatz dankbar. Wichtig ist für uns, dass es einfach zu Administrieren ist, bzw. möglichst
wenig Administrations Aufwand benötigt, da wir ein ziemlich kleines Team sind.

Hoffe, dass uns jemand helfen kann, und bedanken uns im Vorab für die Unterstützung.


Gruss
WBZ-ITS

Content-Key: 334155

Url: https://administrator.de/contentid/334155

Printed on: April 19, 2024 at 22:04 o'clock

Member: emeriks
emeriks Apr 05, 2017 updated at 13:15:23 (UTC)
Goto Top
Hi,
ja, damit biste ganz alleine auf der Welt ... face-wink

Wir haben ein paar Tausend Clients und Drucker und das selbe Problem. Wir haben und dafür aber ne eigene Anwendung programmiert. Bei uns kommt noch hinzu, dass wir das unter Terminalserver betreiben. Die Clients sind in der Mehrheit keine Windows Kisten. Die Drucker sind alle zentral am Printserver installiert. Die Drucker fast alle per TCP/IP am LAN. Die lokal per USB angeschlossenen haben wir unter Windows Clients freigegeben bzw. an Linux Thin Clients per LPR verfügbar und dann trotzdem nochmal am Printsrver installiert. In den TS-Sitzungen werden dann alle Drucker über den Printserver verbunden.

Unser Programm hat früher auch mit einer Datendatei gearbeitet (heute sind die Daten im AD gespeichert). 1. Spalte der Clientname. 2. Spalte der UNC des Druckers vom Printserver.
Wenn ein Client mehrere Drucker hat, dann galt, 1. Zeile für diesen Clientnamen bestimmt den Standarddrucker.

Das Script muss nur die Zeilen der Reihe nach abarbeiten. Erste Spalte vergleichen mit dem lokalen Clientnamen. Wenn Treffer, dann den Drucker aus 2. Spalte verbinden. Das ist kein Hexenwerk.

E.
Member: WBZ-ITS
WBZ-ITS Apr 05, 2017 at 13:20:49 (UTC)
Goto Top
Hallo emeriks

Herzlichen Dank für deine rasche Antwort.

Bei uns sind alle Drucker am LAN und auf einem Printserver installiert, keine lokalen Drucker, ausser ein paar einzelne, die aber eh Speziallösungen sind, und nicht "Administriert" werden müssen.

Genau so was wie du es beschreibst stelle ich mir vor, auch mit dem auslesen aus der AD, wär natürlich Luxus, aber wie setze ich so 'n Script zusammen?

Ich habe ansatzweise ein bisschen Erfahrung mit PS, jedoch nicht tief genug, um externe quellen einzubinden und genau so einen Script zu bauen.

Wenn mir jemand also so was ansatzweise vorfertigen kann, oder zumindest ein Ansatz an Anleitung, wären wir sehr dankbar.


Nochmals Dankeschön und Gruss
WBZ-ITS
Member: clSchak
clSchak Apr 05, 2017 at 13:46:31 (UTC)
Goto Top
Hi

Zielgruppenadressierung oder WMI Filterung anhand der IP Adresse wäre auch möglich, sofern:

  • das Netz via VLAN segmentiert ist, so das es möglich ist

Wir haben alle Büroabschnitte in separate VLANs unterteilt und konnten das darüber steuern, die Kollegen haben dann jeweils max. 3 Drucker vorgegeben (Etagengeräte).

Davon wollen wir allerdings weg und auf "FollowMe"(?) Printing umstellen, des weiteren haben wir vor kurzen alle Bürodrucker aus den Büros genommen (mit Ausnahme von Personalbezogenen Büros), so das die Kollegen nur noch die Etagedrucker haben - hat zwar zu einigen "Konflikten" geführt sich aber schlussendlich gelegt (Druckvolumen um ca. 30% zurück gegangen face-wink ).

Gruß
@clSchak
Member: SeaStorm
SeaStorm Apr 05, 2017 at 14:10:24 (UTC)
Goto Top
Hi

was genau ist denn eure Zielsetzung? Eure Lösung bedeutet ja im Endefekkt immer, das ihr beim erstellen eines neuen Clients eine Liste manuell pflegen müsst.
Das wäre mir jetzt doch zu viel Arbeit und vor allem zu lästig, weil ja ständig jemand anruft und einen anderen Drucker will.
Für mich wäre die "Einsteigerlösung" die nötigen Drucker eines Gebäudes oder Stockwerks in eine Gruppenrichtlinie zu pressen und dafür sorgen, das diese auf dem Client ausgeführt wird.
Also z.B Richtlinie Printer_Buchhaltung -> die Drucker "BuchhaltungFarblaser" und "BuchhaltungBriefkopf" einfügen.
Jetzt kannst du bei entsprechender OU-gestaltung die Richtlinie in die BuHa OU stecken, oder einfach nur die entsprechenden Clients zum ausführen der RL berechtigen. Per GPPs lässt sich das sogar nich flexiebler und bequemer machen.

Dann müsstest du in Zukunft, wenn ein neuer Drucker da hingestellt wird, diesen nur noch in die RL eingeben und alle Clients haben ihn direkt eingebunden.

Und man kann das ganze dann z.B auch gleich für Notebooks ganz toll machen. Man kann zusätzlich eine Richtlinie für die einzelnen IP-Bereiche machen. Wenn der Client sich z.B im Netz 10.10.0.1-254 befindet, kann man gleich mal die Drucker "München1-5" einbinden, weil sich der Client dann in München befindet. Toll für Kollegen, die zwischen den Niederlassungen wechseln usw.

Kurz: Die GPO/GPPs machen es einem da eigentlich sehr leicht, sich nie wieder um die Drucker kümmern zu müssen, wenn man es ein mal richtig aufgesetzt hat.

Und Standarddrucker sollte der Client selbst setzen. Das bleibt ja im Profil des Users gespeichert. Wenn er einen gewissen Drucker als Standard will, soll er das setzen und auch behalten dürfen. Hat ja einen Grund, warum er das macht
Member: emeriks
emeriks Apr 05, 2017 at 15:23:15 (UTC)
Goto Top
Hier ein altes VBscript-Code-Schnipsel von mir. Ohne jede Gewähr.
"DataFilePath" musst Du noch anpassen.
Alles ganz primitiv. Keine große Logik dahinter.

Wenn Du das mit dem Standarddrucker nicht haben willst, dann einfach die Zeile mit dem "SetDefaultPrinter" auskommentieren.

On Error Resume Next

'Je Zeile, 1x, COMPUTERNAME <tab> PrinterUNC  
'Bsp:   
'CLIENT0815<tab>\\PRINTSERVER1\DruckerA  
'CLIENT0815<tab>\\PRINTSERVER1\DruckerB  
'CLIENT0815<tab>\\PRINTSERVER1\DruckerC  
'CLIENTxxxx<tab>\\PRINTSERVER1\DruckerA  
'#Kommentar  
Const DataFilePath = "\\domain.local\NETLOGON\Client2Printer.txt"     

Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject")  
Dim WshNet : Set WshNet = CreateObject("Wscript.Network")  

If FSO.FileExists(DataFilePath) Then
  Dim CurrentClient : CurrentClient = GetClientName
  Dim DefaultPrinter : DefaultPrinter = ""  
  Dim Line, ClientName, PrinterUNC
  With FSO.OpenTextFile(DataFilePath)
    While Not .AtEndOfStream
      Line = Trim(.ReadLine)
      If Line <> "" And _  
         Not Left(Line,1) = "#" Then  
        ClientName = "" : ClientName = Trim(Split(Line,vbTab)(0))  
        PrinterUNC = "" : PrinterUNC = Trim(Split(Line,vbTab)(1))  
        If UCase(ClientName) = UCase(CurrentClient) And _
           PrinterUNC <> "" Then  
          If DefaultPrinter = "" Then  
            DefaultPrinter = PrinterUNC
          End If
          WshNet.AddWindowsPrinterConnection PrinterUNC
        End If
      End If
    Wend
    If DefaultPrinter <> "" Then  
      WshNet.SetDefaultPrinter DefaultPrinter
    End If
  End With
End If

WScript.Quit


Function GetClientName
  On Error Resume Next
  Dim ReturnValue
  ReturnValue = ""  
  ReturnValue = UCase(CreateObject("Wscript.Shell").ExpandEnvironmentStrings("%CLIENTNAME%"))  
  If ReturnValue = "%CLIENTNAME%" Or _  
     ReturnValue = "CONSOLE" Then  
    ReturnValue = UCase(CreateObject("Wscript.Network").ComputerName)  
  End If
  GetClientName = ReturnValue
End Function
Member: WBZ-ITS
WBZ-ITS Apr 06, 2017 at 04:57:51 (UTC)
Goto Top
Hallo clSchank

Danke für deine Antwort.

Leider ist dies bei uns nicht der Fall, bzw. wir haben die IPs nur in 2 VLANs segmentiert, da wir 2 Gebäude haben, aber nicht weiter verfeinert.

Das mit den "weniger" drucker wäre super, sehe ich auch so, das würde die Druckmenge drastisch reduzieren, jedoch würde dies nicht zu "Konflikte" führen, sondern zu regelrechte Amokläufe! face-smile

Es ist so, dass hier jeder Abteilungsleiter sein Einzelbüro hat, und dementsprechend sein Drucker im Büro, plus alle anderen seiner Abteilung, plus evtl. Allgemeine Etagendrucker, beispielsweise Farb- oder A3 Drucker. Er hat ein anderer Standard Drucker als seine MAs, und das macht es dann schwierig mit den GPOs, da ich dort kein Standarddrucker definieren kann, oder zu viele GPOs erstellen müsste um das Ziel zu erreichen.

Jedenfalls danke für deinen Ansatz, werde mich mit den Jahren mal an den weniger Drucker ran tasten! ;)


Gruss
WBZ-ITS
Member: WBZ-ITS
WBZ-ITS Apr 06, 2017 at 05:04:13 (UTC)
Goto Top
Hallo SeaStorm

Danke für deinen Vorschlag.

Das haben wir auch schon angeschaut, mit den GPOs, aber wie ich schon an clSchak geschrieben habe, ich müsste extrem viele GPOs erstellen, um das Ziel zu erreichen.

Es ist so, dass hier jeder Abteilungsleiter sein Einzelbüro hat, und dementsprechend sein Drucker im Büro, plus alle anderen seiner Abteilung, plus evtl. Allgemeine Etagendrucker, beispielsweise Farb- oder A3 Drucker. Er hat ein anderer Standard Drucker als seine MAs, und das macht es dann schwierig mit den GPOs, da ich dort kein Standarddrucker definieren kann, oder zu viele GPOs erstellen müsste um das Ziel zu erreichen.

Zudem gibt es ALs, die gar nicht wollen, das Ihre MAs alle Drucker erhalten, die in der Abteilung zur Verfügung stehen.

GPPs sind zwar noch besser um "feinkörnig" zu bestimmen, wer welche Drucker erhalten soll, jedoch zu Aufwendig für unser Zweck und Umgebung, da müsste ich für fast jeden Benutzer eine GPP erstellen! face-sad

Aber herzlichen Dank für dein Vorschlag, die Idee mit den GPOs werde ich nicht ganz aus meinem Kopf verbannen, da es mir die liebste wäre.


Gruss
WBZ-ITS
Member: WBZ-ITS
WBZ-ITS Apr 06, 2017 at 05:06:00 (UTC)
Goto Top
Hallo emeriks

Vielen Herzlichen Dank für das Script.

Werde ich sicher ausprobieren, ist zwar nicht PS, jedoch geht es in der Richtung die ich will!

Nochmals Dankeschön, und bleibe offen für weitere Vorschläge!


Gruss
WBZ-ITS
Member: WBZ-ITS
WBZ-ITS Apr 24, 2017 at 07:36:55 (UTC)
Goto Top
Hallo zusammen

Ich brauche immer noch Hilfe, und zwar bin ich einen kleinen Schritt weiter, aber das Problem ist nicht gelöst.

Die Situation ist folgende:

Im Unternehmen müssen wir ca. 60/70 Drucker auf ca. 180 PC Mappen. Alle Drucker sind auf einem Druckserver bereits installiert und vorhanden, haben eigene Namen, IP-Adressen, Einstellungen etc.

Die Verteilung soll via PowerShell anhand einer Liste geschehen, nicht via GPO oder ähnliches, da die Bedingungen (Standarddrucker, Anzahl Drucker etc.) je nach Maschine und Benutzer sehr variieren können. Zudem sind wir so viel flexibler beim deployen.

Bisher machten wir dies via Kix-Script und einer .ini Datei. Wollen aber von Kix weg und ein PowerShell Script via GPO beim Systemstart benutzen.

Ich hab nun ein PowerShell Script mal zusammen geschustert, und eine CSV erstellt, in welcher die PCs mit den entsprechenden Drucker und die Standard angegeben werden. Jedoch geht der nicht.

Deshalb hier miene Frage....wo mach ich was falsch? Gibt es auch eine bessere, elegantere, übersichtlichere Variante das CSV File zu erstellen?

Hier mal das CSV, bzw. ein Ausschnitt wie es aussieht:


#TYPE Selected.System.Management.ManagementObject.Data.DataRow
 Name
 PC0001
 \\SV0002\PR0001, True
 \\SV0002\PR00002

 Name
 PC0002
 \\SV0002\PR0001, True
 \\SV0002\PR00002​

Und das ist das PS-Script den ich anwenden möchte:

Get–WMIObject Win32_Printer | where{$_.Network -eq ‘true‘} | foreach{$_.delete()}

 $Printers=IMPORT-CSV \\server\$env:username\printers.csv

 FOREACH ($Printer in $Printers) {
 Invoke-Expression 'rundll32 printui.dll PrintUIEntry /in /q /n $($Printer.Name)'  

 }​

Das vor dem anhängen der Drucker alle zuerst gelöscht werden ist Absicht, so kann ich gewährleisten, dass bei einer Servermigration oder ähnliches, alle alte Drucker zuerst entfernt werden.

Bedanke mich jetzt schon für eure Hilfe und wünsche einen ruhigen Montagmorgen.


Gruss
WBZ-ITS
Member: emeriks
emeriks Apr 24, 2017 at 08:22:23 (UTC)
Goto Top
Du müsstest uns doch erstmal bitte mittteilen, was konkret nicht geht, welche Fehlermeldung Du konkret wann bekommst!

Unabhängig davon:
\\server\$env:username\printers.csv
Willst Du ernsthaft für jeden Benutzer eine Freigabe erstellen? Wäre es nicht sinnvoller, in einer Freigabe pro Benutzer eine Datei zu erstellen?
$Printers=IMPORT-CSV \\server\freigabe\$env:username.csv 
Member: WBZ-ITS
WBZ-ITS Apr 24, 2017 at 08:59:17 (UTC)
Goto Top
Hallo emeriks

Danke für die rasche Antwort.

Wie gesagt, das Script ist "Zusammen geschustert" aus diverse "geklaute" Blöcke, da ich kein PS experte bin, deshalb hat's hie und da sicher alte/übernommene Schnipsel.

Das CSV liegt auf eine Freigabe wo eh alle bereits zugriff haben, also im Netlogon Verzeichnis des DCs.

Das Script soll anhand der Liste in der CSV die Drucker auf den entsprechenden Maschinen beim anmelden oder beim starten Mappen.

Es muss nicht unbedingt eine CSV sein, wir hätten theoretisch eine .ini Datei, die bereits stimmt, nur ist diese für das bestehende Kix ausgelegt, die sieht also so aus:

[PC0001]
Printer-1=\\SV0001\PR0001
Printer-2=\\SV0001\PR0002
Default=1
[PC0002]
Printer-1=\\SV0001\PR0001
Printer-2=\\SV0001\PR0002
Default=2

Wie erwähnt möchten wir das Kix zwar ersetzen, jedoch durch PS, da es MS Native ist. Eigentlich wollten wir sogar ganz weg von Logonscripts, und alles via GPO/GPP machen, jedoch ist das aufgrund der komplexen Gegebenheiten betreffend Drucker nicht möglich. Mit GPO/GPP wäre es ein administrativer Super Gau das ganze zu erstellen, und dann zu administrieren.

Deshalb den Aufwand mit dem Script, welcher dann via GPO deployt wird.


Danke und Gruss
WBZ-ITS
Member: emeriks
emeriks Apr 24, 2017 updated at 09:49:12 (UTC)
Goto Top
Das CSV liegt auf eine Freigabe wo eh alle bereits zugriff haben, also im Netlogon Verzeichnis des DCs.
Und warum versuchst Du dann die CSV von woanders zu importieren?
$Printers=IMPORT-CSV \\server\$env:username\printers.csv
Member: WBZ-ITS
WBZ-ITS Apr 24, 2017 at 11:58:18 (UTC)
Goto Top
Hello again

Ok, hab das irgendwie nicht gesehen, dass ich dort eine Umgebungsvariable mit einkopiert hatte.

Hab's nun korrigiert auf

$Printers=IMPORT-CSV \\server\Netlogon\Unterverzeichnis\printers.csv

Probiert hab ich es jetzt noch nicht, frag mich, aber, ob die CSV vom Script so richtig interpretiert wird,
und auch ob das Script überhaupt richtig ist.

Sind weitere Fehler aufgefallen?


Gruss
WBZ-ITS
Member: emeriks
Solution emeriks Apr 24, 2017 at 13:06:14 (UTC)
Goto Top
Wenn Du nur wild was zusammenkopierst, ohne es auch nur halbwegs zu verstehen, dann wird das nichts.

Wenn Du nur eine Datei für alle Clients hast, dann musst Du bei der Ausführung zunächst noch nach diesem Computernamen filtern. Sonst verbindest Du alle in der Datei genannten Drucker.

Bsp. für CSV
PC0001, \\SV0002\PR0001, True
PC0001, \\SV0002\PR00002, False
PC0002, \\SV0002\PR0001, True
PC0002, \\SV0002\PR00002​, False
Member: WBZ-ITS
WBZ-ITS Apr 24, 2017 at 13:21:27 (UTC)
Goto Top
Hallo emeriks

Leider kann ich das nur so, meine Erfahrung und KNow How in Sachen Script sind ziemlich begrenzt, deshalb auch mein Hilfeschrei auf dieser Seite.

Hab das csv etwas editiert, und sieht nun so aus:

Client;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;Default
PC0001;
\\SV0001\PR0001;
\\SV0001\PR0002;
;
;
;
;
;
;
;
;
;
;
;
;
;
pr_01

PC0002;
\\SV0001\PR0001;
\\SV0001\PR0002;
\\SV0001\PR0003;
;
;
;
;
;
;
;
;
;
;
;
;
pr_03

Reicht es nicht, wenn ich im Script mit dem FOREACH Befehl jeder PC abgearbeitet wird?
Member: emeriks
emeriks Apr 24, 2017 at 13:24:01 (UTC)
Goto Top
Nichts für ungut bitte. Ich habe Dir bereits eine funktionierende Variante für VBscript geliefert.
Member: WBZ-ITS
WBZ-ITS Apr 24, 2017 at 13:37:23 (UTC)
Goto Top
Ist ok, danke dir trotzdem für deine Hilfe.


Gruss
WBZ-ITS
Member: WBZ-ITS
WBZ-ITS Apr 28, 2017 at 09:24:47 (UTC)
Goto Top
Nach langem suchen, fragen, bearbeiten und testen, hab ich endlich eine Lösung, und möchte sie anderen mit gleichen Aufgabenstellungen nicht vorenthalten, also, die Lösung sieht wie folgt aus:

Das CSV:
name,printers,defaultprinter
PC0001,\\SV0001\PR0001;\\SV0001\PR0002,PR0002
PC0002,\\SV0001\PR0001;\\SV0001\PR0003,PR0003
PC0003,\\SV0001\PR0001;\\SV0001\PR0004,PR0004

Dann das Skript:
$csv = "\\server\Netlogon\Subfolder\printers.csv"  
$Computers = Import-Csv $csv

foreach ($Computer in $Computers){
    If ($Computer.name -eq $env:computername) {
        $Printers = ($Computer.printers).split(";")  
        foreach ($Printer in $Printers) {Add-Printer-ConnectionName $Printer -ErrorAction SilentlyContinue}

        (New-Object -ComObject WScript.Network).SetDefaultPrinter("$($Computer.defaultprinter)")  
    }
}

Und zudem noch einen Skript, welches beim Abmelden die Drucker wieder trennt:
#$a = Get-WMIObject -query "Select * From Win32_Printer Where Name = 'Microsoft Print to PDF'" 
#$a.SetDefaultPrinter()
$TargetPrinter = "Microsoft Print to PDF"  
$ErrorActionPreference = “SilentlyContinue”
$LocalPrinter = GWMI -class Win32_Printer | Where {$_.Name -eq $TargetPrinter}
$LocalPrinter.SetDefaultPrinter()
$ErrorActionPreference = “Stop”

Get-WmiObject -Class Win32_Printer | where{$_.Network -eq ‘true‘}| foreach{$_.delete()}

Zum disconnecten muss zuerst der Standarddrucker geändert werden, sonst wird dieser nicht getrennt.

Anschliessend hab ich eine GPO erstellt und das Verbinden Skript unter Benutzerkonfiguration\Richtlinien\Windows-Einstellungen\Skripts Anmelden in der Registerkarte Powershell gesetzt, respektive das Trennen Skript an gleicher stelle bei "Abmelden".

Noch zusätzlich ein paar Trubleshooting Tipps, sollte die GPO nicht greiffen:

Die Skripte funktionieren nicht, wenn sie als Machine GPOs bei Startup oder Shutdown eingesetzt werden. Diese Müssen unter einer User GPO sein und zwar unter Benutzerkonfiguration\Windows-Einstellungen\Skripts bei Anmelden, bzw. Abmelden.

Zusätzlich muss dann noch unter Computerkonfiguration\Administrative Vorlagen\System\Gruppenrichtlinie bei Anmldeskriptverzögerung konfigurieren auf Aktiviert setzen und den Standardwert von 5 auf 0 Minuten setzen, sonst werden die Skripte erst 5 Minuten nach der Anmeldung ausgeführt.

Und weiter, sollte es immer noch nicht gehen, gibt es 2 Fehlerquellen, zum einen, kann es sein, dass GPOs welche auf einem Win 7 Rechner erstellt wurden auf einem 2008R2, 2012R2 Server, oder Win 8 oder 10 Rechner nicht greifen. Am besten also die GPOs direkt auf dem Server/DC erstellen.

Zum anderen, kann eine Fehlerquelle gelöst werden, indem man beim erstellen der GPO im Fenster für den Skript, als Skriptname powershell.exe eingibt, und als Skriptparameter folgendes: -F "\\SERVER\FREIGABE\meinskript.ps1"

Dann sollte es funzen.

Hoffe, dass diese Anleitung anderen hilft.


Gruss
WBZ-ITS
Member: WBZ-ITS
WBZ-ITS Apr 28, 2017 at 09:33:27 (UTC)
Goto Top
Zitat von @emeriks:

Wenn Du nur wild was zusammenkopierst, ohne es auch nur halbwegs zu verstehen, dann wird das nichts.

Wenn Du nur eine Datei für alle Clients hast, dann musst Du bei der Ausführung zunächst noch nach diesem Computernamen filtern. Sonst verbindest Du alle in der Datei genannten Drucker.

Bsp. für CSV
PC0001, \\SV0002\PR0001, True
> PC0001, \\SV0002\PR00002, False
> PC0002, \\SV0002\PR0001, True
> PC0002, \\SV0002\PR00002​, False

Nach langem suchen, fragen, bearbeiten und testen, hab ich endlich eine Lösung, und möchte sie anderen mit gleichen Aufgabenstellungen nicht vorenthalten, also, die Lösung sieht wie folgt aus:

Das CSV:
name,printers,defaultprinter
PC0001,\\SV0001\PR0001;\\SV0001\PR0002,PR0002
PC0002,\\SV0001\PR0001;\\SV0001\PR0003,PR0003
PC0003,\\SV0001\PR0001;\\SV0001\PR0004,PR0004

Dann das Skript:
$csv = "\\server\Netlogon\Subfolder\printers.csv"  
$Computers = Import-Csv $csv

foreach ($Computer in $Computers){
    If ($Computer.name -eq $env:computername) {
        $Printers = ($Computer.printers).split(";")  
        foreach ($Printer in $Printers) {Add-Printer-ConnectionName $Printer -ErrorAction SilentlyContinue}

        (New-Object -ComObject WScript.Network).SetDefaultPrinter("$($Computer.defaultprinter)")  
    }
}

Und zudem noch einen Skript, welches beim Abmelden die Drucker wieder trennt:
#$a = Get-WMIObject -query "Select * From Win32_Printer Where Name = 'Microsoft Print to PDF'" 
#$a.SetDefaultPrinter()
$TargetPrinter = "Microsoft Print to PDF"  
$ErrorActionPreference = “SilentlyContinue”
$LocalPrinter = GWMI -class Win32_Printer | Where {$_.Name -eq $TargetPrinter}
$LocalPrinter.SetDefaultPrinter()
$ErrorActionPreference = “Stop”

Get-WmiObject -Class Win32_Printer | where{$_.Network -eq ‘true‘}| foreach{$_.delete()}

Zum disconnecten muss zuerst der Standarddrucker geändert werden, sonst wird dieser nicht getrennt.

Anschliessend hab ich eine GPO erstellt und das Verbinden Skript unter Benutzerkonfiguration\Richtlinien\Windows-Einstellungen\Skripts Anmelden in der Registerkarte Powershell gesetzt, respektive das Trennen Skript an gleicher stelle bei "Abmelden".

Noch zusätzlich ein paar Trubleshooting Tipps, sollte die GPO nicht greiffen:

Die Skripte funktionieren nicht, wenn sie als Machine GPOs bei Startup oder Shutdown eingesetzt werden. Diese Müssen unter einer User GPO sein und zwar unter Benutzerkonfiguration\Windows-Einstellungen\Skripts bei Anmelden, bzw. Abmelden.

Zusätzlich muss dann noch unter Computerkonfiguration\Administrative Vorlagen\System\Gruppenrichtlinie bei Anmldeskriptverzögerung konfigurieren auf Aktiviert setzen und den Standardwert von 5 auf 0 Minuten setzen, sonst werden die Skripte erst 5 Minuten nach der Anmeldung ausgeführt.

Und weiter, sollte es immer noch nicht gehen, gibt es 2 Fehlerquellen, zum einen, kann es sein, dass GPOs welche auf einem Win 7 Rechner erstellt wurden auf einem 2008R2, 2012R2 Server, oder Win 8 oder 10 Rechner nicht greifen. Am besten also die GPOs direkt auf dem Server/DC erstellen.

Zum anderen, kann eine Fehlerquelle gelöst werden, indem man beim erstellen der GPO im Fenster für den Skript, als Skriptname powershell.exe eingibt, und als Skriptparameter folgendes: -F "\\SERVER\FREIGABE\meinskript.ps1"

Dann sollte es funzen.

Hoffe, dass diese Anleitung anderen hilft.


Gruss
WBZ-ITS