none
Powershellscript zu AddWindowsPrinterConnection RRS feed

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

    Dienstag, 3. Januar 2012 08:45

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"
    

    Freitag, 6. Januar 2012 11:12

Alle Antworten

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

    Oder: http://blogs.technet.com/b/heyscriptingguy/archive/2009/05/20/how-can-i-use-windows-powershell-to-remove-old-printer-connections-list-printers-and-set-new-default-printers.aspx


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


    Donnerstag, 5. Januar 2012 12:17
  • 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"
    

    Freitag, 6. Januar 2012 11:12