Benutzer mit den meisten Antworten
Powershellscript zu AddWindowsPrinterConnection

Frage
-
Hallo,
Problem ist folgendes, dass wir mehrere hundert clients haben, wobei jeder einzelne mit verschiedenen druckern verbunden ist. jeder drucker ist an ein bestimmten druckserver gebunden, der standortspezifisch zu dem client ist. Jetzt werden die einzelnen druckserver geändert und die entsprechenden drucker zu den clients müssen auch neu verbunden verden. Bei mehreren hundert pc ist das sehr vielr arbeit. Mein script sieht folgendermaßen aus.
Die drucker werden ausgelesen, in eine datei geschrieben, die datei wird ausgelesen und die drucker werden enternt, dann werden die die entsprechenden pararmeter für den neuen server gesetz und die drucker unter dem selber namen aus der datei wieder neu verbunden. jedenfalls geht es nicht und es kommen immer fehlermeldungen:
\\server\printer
Ausnahme beim Aufrufen von "RemovePrinterConnection" mit 1 Argument(en): "Diese Netzwerkverbindung ist nicht vorhanden.
"
Bei C:-path\v03.ps1:28 Zeichen:52
+ $AddNetwork.RemovePrinterConnection <<<< ($contentName[$i])
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
bzw beim verbinden :
\\server\printer
Ausnahme beim Aufrufen von "AddWindowsPrinterConnection" mit 1 Argument(en): "Der Druckername ist unzulässig. (Ausnahme von HRESULT: 0x80070709)"
Bei path\v03.ps1:48 Zeichen:48
+ $AddNetwork.AddWindowsPrinterConnection <<<< ($PrinterName)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
das script sieht so aus:
#ermittlen der neuen serveradresse anhand des computernamens [string]$computer =gc env:computername #auslesen des computernamens $snr= $computer[2]+$computer[3] #nutzen der stellen zwei und drei für server nummer $server= "z32"+ $snr +"123" #zusammensetzen des servernamens Get-WmiObject -Class Win32_Printer |Format-Table ShareName -HideTableHeaders |Out-File .\TmpPrinterShareName.txt #auslesen der aktuellen druckernamen und schreiben in datei TmpPrinterShareName.txt Get-WmiObject -Class Win32_Printer |Format-Table Name -HideTableHeaders |Out-File .\TmpPrinterPath.txt #auslesen der druckerverbindungen und schreiben in datei TmpPrinterPath.txt #auslesen der Daten aus TmpPrinterShareName.txt und TmpPrinterPath.txt $contentSName=get-Content -Path .\TmpPrinterShareName.txt $contentName=Get-Content -Path .\TmpPrinterPath.txt $AddNetwork=(New-Object -ComObject WScript.Network) $PrinterNum = ($AddNetwork.EnumPrinterConnections()) #zählen der verbunden drucker 'Netzwerkdrucker entfernen' [int32]$counts=$PrinterNum.Count()/2 #teilung durch zwei, da zu jeder verbindung ip und name angegeben wird. for($i=0;$i -le $counts;$i++) #schleife zum löschen der druckerverbindungen { if($contentName[$i] -eq "Microsoft XPS Document Writer") {$i++} else{ $contentName[$i] $AddNetwork.RemovePrinterConnection($contentName[$i]) } } 'Netzwerkdrucker hinzufügen' for($i=0;$i -le $ContentSName.Count;$i++) #erstellt neue verbindung zu den druckern { if($contentname[$i] -eq "") {$i++} elseif($contentName[$i] -eq"Microsoft XPS Document Writer") {$i++} else{ $PrinterName="\\$server\"+$ContentSName[$i] $PrinterName $AddNetwork.AddWindowsPrinterConnection($PrinterName) } } rm ".\TmpPrinterShareName.txt" rm ".\TmpPrinterPath.txt"
Danke für die Hilfe !
- Verschoben Raul TalmaciuMicrosoft contingent staff Mittwoch, 4. Januar 2012 13:25 PowerShell Frage (aus:Windows Client)
Antworten
-
danke, habs auch hinbekommen, das Problem lag daran, dass in dem Textdokument Leerzeichen mit hinzugefügt wurden. skript sieht jetzt so aus :
#ermittlen der neuen serveradresse anhand des computernamens [string]$computer =gc env:computername #auslesen des computernamens "WS Name: $computer" $snr= $computer[2]+$computer[3] #nutzen der stellen zwei und drei für neue nummer #$server= "z32"+ $fanr +"123" #zusammensetzen des servernamens $server="\\"+$server+"\" "Druckserver: $server" $AddNetwork=(New-Object -ComObject WScript.Network) Get-WmiObject -Class Win32_Printer |Format-Table ShareName -HideTableHeaders |Out-File .\TmpPrinterShareName.txt #auslesen der aktuellen druckernamen und schreiben in datei TmpPrinterShareName.txt Get-WmiObject -Class Win32_Printer |Format-Table Name -HideTableHeaders |Out-File .\TmpPrinterPath.txt #auslesen der druckerverbindungen und schreiben in datei TmpPrinterPath.txt #auslesen der Daten aus TmpPrinterShareName.txt und erstellen der $contentSNameSplit, da Leerzeichen entfernt werden müssen. $contentSName=get-Content -Path .\TmpPrinterShareName.txt $contentSNameArray=[System.String]::Join(";",$contentSName) For($i=0;$i -le 300;$i++) { $contentSNameArray=$contentSNameArray-replace " ","" #Entfernen der Leerzeichen } $contentSNameArray=$contentSNameArray-replace ";;","" $contentSNameSplit=$contentSNameArray.Split(";") #Erstellen des Arrays ohne Leerzeichen #auslesen der Daten aus TmpPrinterPath.txt und erstellen der $contentNameSplit, da Leerzeichen entfernt werden müssen. $contentName=Get-Content -Path .\TmpPrinterPath.txt $contentNameArray=[System.String]::Join(";",$contentName) For($i=0;$i -le 300;$i++) { $contentNameArray=$contentNameArray-replace " ","" #Entfernen der Leerzeichen } $contentSNameArray=$contentNameArray-replace ";;","" $contentNameSplit=$contentNameArray.Split(";") #Erstellen des Arrays ohne Leerzeichen 'Netzwerkdrucker entfernen' $contentNameSplit|ForEach-Object{Write-Host "$_"$AddNetwork.RemovePrinterConnection($_)} #schleife zum loeschen der druckerverbindungen 'Netzwerkdrucker hinzufügen' $contentSNameSplit|ForEach-Object{Write-Host "$server$_" $AddNetwork.AddWindowsPrinterConnection($server+$_)} #schleife zum erstellen der druckerverbindungen #loeschen der TmpPrinterShareName.txt und TmpPrinterPath.txt rm ".\TmpPrinterShareName.txt" rm ".\TmpPrinterPath.txt"
- Als Antwort markiert Raul TalmaciuMicrosoft contingent staff Freitag, 6. Januar 2012 11:14
Alle Antworten
-
Hallo,
ich habe den Thread in das PowerShell Forum verschoben, da es eher eine PowerShell Frage ist:
http://social.technet.microsoft.com/Forums/de-de/powershell_de/threads
Gruss,
RaulRaul Talmaciu, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Zum Drucker verwalten mit PowerShell nimmt man am besten WMI und nicht das Nework Objekt!
# Drucker löschen (entfernen) (Auch Netzwerkdrucker!) $a = Get-WMIObject -query "Select * From Win32_Printer Where Name = 'Test Drucker'" $a.delete() # Netzwerk Drucker zufügen $a = [wmiclass] Win32_Printer $a.AddPrinterConnection("\\atl-ps-001\TestPrinter")
Siehe auch: http://www.searchnetworking.de/themenbereiche/infrastruktur/server-desktops/articles/96671/
Please mark helpful posts of me as helpful, and post that are the answers as answers! Thank you ;-)) Bitte markiere hilfreiche Beiträge von mir als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort". Das wäre Nett :-))
- Bearbeitet Peter Kriegel Freitag, 6. Januar 2012 06:29
-
danke, habs auch hinbekommen, das Problem lag daran, dass in dem Textdokument Leerzeichen mit hinzugefügt wurden. skript sieht jetzt so aus :
#ermittlen der neuen serveradresse anhand des computernamens [string]$computer =gc env:computername #auslesen des computernamens "WS Name: $computer" $snr= $computer[2]+$computer[3] #nutzen der stellen zwei und drei für neue nummer #$server= "z32"+ $fanr +"123" #zusammensetzen des servernamens $server="\\"+$server+"\" "Druckserver: $server" $AddNetwork=(New-Object -ComObject WScript.Network) Get-WmiObject -Class Win32_Printer |Format-Table ShareName -HideTableHeaders |Out-File .\TmpPrinterShareName.txt #auslesen der aktuellen druckernamen und schreiben in datei TmpPrinterShareName.txt Get-WmiObject -Class Win32_Printer |Format-Table Name -HideTableHeaders |Out-File .\TmpPrinterPath.txt #auslesen der druckerverbindungen und schreiben in datei TmpPrinterPath.txt #auslesen der Daten aus TmpPrinterShareName.txt und erstellen der $contentSNameSplit, da Leerzeichen entfernt werden müssen. $contentSName=get-Content -Path .\TmpPrinterShareName.txt $contentSNameArray=[System.String]::Join(";",$contentSName) For($i=0;$i -le 300;$i++) { $contentSNameArray=$contentSNameArray-replace " ","" #Entfernen der Leerzeichen } $contentSNameArray=$contentSNameArray-replace ";;","" $contentSNameSplit=$contentSNameArray.Split(";") #Erstellen des Arrays ohne Leerzeichen #auslesen der Daten aus TmpPrinterPath.txt und erstellen der $contentNameSplit, da Leerzeichen entfernt werden müssen. $contentName=Get-Content -Path .\TmpPrinterPath.txt $contentNameArray=[System.String]::Join(";",$contentName) For($i=0;$i -le 300;$i++) { $contentNameArray=$contentNameArray-replace " ","" #Entfernen der Leerzeichen } $contentSNameArray=$contentNameArray-replace ";;","" $contentNameSplit=$contentNameArray.Split(";") #Erstellen des Arrays ohne Leerzeichen 'Netzwerkdrucker entfernen' $contentNameSplit|ForEach-Object{Write-Host "$_"$AddNetwork.RemovePrinterConnection($_)} #schleife zum loeschen der druckerverbindungen 'Netzwerkdrucker hinzufügen' $contentSNameSplit|ForEach-Object{Write-Host "$server$_" $AddNetwork.AddWindowsPrinterConnection($server+$_)} #schleife zum erstellen der druckerverbindungen #loeschen der TmpPrinterShareName.txt und TmpPrinterPath.txt rm ".\TmpPrinterShareName.txt" rm ".\TmpPrinterPath.txt"
- Als Antwort markiert Raul TalmaciuMicrosoft contingent staff Freitag, 6. Januar 2012 11:14