praxmo
Goto Top

Druckverteilung über Powershell - Probleme

Hallo zusammen,

ich arbeite noch daran, die von einem Dienstleister damals zusammengeschusterte Powershell-Druckverteilung etwas anzupassen und stoße dabei leider auf Probleme.

Setup wie folgt:
Druckserver Win2012 R2
Terminalserverfarm Win2012 R2

Das bisherige Script funktioniert so:
1. Jeden Morgen via Aufgabenplanung wird auf jedem Terminalserver folgendes ".cmd"-Script ausgeführt:
Powershell.exe -executionpolicy Unrestricted -File  \\XXX\NETLOGON\Drucker\Admin\AdminPrinter.ps1
Powershell.exe -executionpolicy Unrestricted -File  \\XXX\NETLOGON\Drucker\Admin\ArcPrinter.ps1

Die ausgeführten Powershell-Scripte sehen so aus:
"Adminprinter.ps1":
$csvPath = "\\XXX\NETLOGON\Drucker\Admin\Printers.csv"  

$userdomain = $env:UserDomain
$username = $env:UserName

write-host "current User: " $username  
write-host "current Domain: " $userdomain  

# Alle freigegebenen (nicht Netzwerkdrucker!) löschen
Get-Printer | where{$_.Shared -eq $False} | Remove-Printer

$csvContent = import-csv $csvPath -Delimiter ";" | Where-Object {$_.username -eq $username -and $_.domain -eq $userdomain }  

foreach ($content in $csvContent)
{
    Write-Host "CSV domain: " $content.("domain")  
    Write-Host "CSV username: " $content.("username")  
    Write-Host "CSV printserver: " $content.("printserver")  
    Write-Host "CSV printers: " $content.("printer")  
    Write-Host "CSV driver: " $content.("driver")  
    Write-Host "CSV default: " $content.("default")  

    # Netzwerkdrucker setzen
    $PrinterName = "\\" + $content.("printserver") + "\" + $content.("printer")  

    $PrinterPorts = Get-PrinterPort |  Where-Object {$_.Name -eq $PrinterName}
    if(!$PrinterPorts)
    {
    Write-Host $PrinterPort.Name " noch nicht vorhanden"          
    add-printerport -name $PrinterName 
    
    }   
    Remove-Printer -name $content.("printer")  
    add-printer -name $PrinterName -drivername $content.("driver") -port $PrinterName  
    #add-printer -name $PrinterName -drivername $content.("driver") 
    #(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection($PrinterName)

    if($content.("default") -eq 1)  
    {
        Write-Host "Standard Drucker wird gesetzt:" $content.("printer")  
        (New-Object -ComObject WScript.Network).SetDefaultPrinter($content.("printer"))  
    }

}

Die ArcPrinter-Datei sieht ähnlich aus, nur der ".csv"-Pfad ist hierbei anders.

Die besagte ".csv" sieht so aus:
domain;username;printserver;printer;default;driver
hierdomänenname;administrator;hieripdesdruckservers;hierderdruckername;0;treibername

Der Nutzer hat dann via GPO ein Logon-Script zugewiesen bekommen, der aus den Nachts hinzugefügten Druckern den Standarddrucker setzt:
$csvPath = "\\XXX\NETLOGON\Drucker\Printers.csv"  

$userdomain = $env:UserDomain
$username = $env:UserName

write-host "current User: " $username  
write-host "current Domain: " $userdomain  

$csvContent = import-csv $csvPath -Delimiter ";" | Where-Object {$_.username -eq $username -and $_.domain -eq $userdomain }  

foreach ($content in $csvContent)
{
    Write-Host "CSV domain: " $content.("domain")  
    Write-Host "CSV username: " $content.("username")  
    Write-Host "CSV printserver: " $content.("printserver")  
    Write-Host "CSV printers: " $content.("printer")  
    Write-Host "CSV driver: " $content.("driver")  
    Write-Host "CSV default: " $content.("default")  

    if($content.("default") -eq 1)  
    {
        Write-Host "Standard Drucker wird gesetzt:" $content.("printer")  
        (New-Object -ComObject WScript.Network).SetDefaultPrinter($content.("printer"))  
    }

}

Durch das Entfernen der freigegebenen Drucker musste ich nur den FreePDF-Drucker freigeben, damit dieser nicht vom Powershell-Script entfernt wird.
Jedoch stehe ich nun vor einem neuen Problem: Ich möchte einigen Farbdruckern den S/W-Druck als Standard setzen, jedoch übernimmt er dies nicht vom Druckserver. Was wäre hier der klügste Weg?

Viele Grüße
praxmo

Content-Key: 456943

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

Printed on: May 6, 2024 at 12:05 o'clock

Mitglied: 139920
139920 May 29, 2019 updated at 14:09:46 (UTC)
Goto Top
Ich möchte einigen Farbdruckern den S/W-Druck als Standard setzen
Kann man auch über die Powershell machen:
# Druckername dessen Print-Servereinstellungen geändert werden sollen
$printerName = "HP Laserjet 1320"  

Add-Type -AssemblyName System.Printing
$adminServer = [System.Printing.PrintSystemDesiredAccess]::AdministrateServer
$adminPrinter = [System.Printing.PrintSystemDesiredAccess]::AdministratePrinter
$server = new-object System.Printing.LocalPrintServer $adminServer
$queues = $server.GetPrintQueues() | ?{$_.Name -eq $printerName }

foreach($q in $queues){
    $objPrinter = new-object System.Printing.PrintQueue -argumentList $server,$q.Name,$adminPrinter
    # >>>>>>>>>>>>>>
    $objPrinter.DefaultPrintTicket.OutputColor = [System.Printing.OutputColor]::Grayscale
    # <<<<<<<<<<<<<<
    $objPrinter.Commit()
}
Member: praxmo
praxmo May 31, 2019 at 09:11:38 (UTC)
Goto Top
Hallo Shellschrubber,

habe beim Script mal von einem Farbdrucker den Namen eingetragen und es als Administrator ausgeführt auf einem der Terminalserver, leider ändert es nichts.

Gruß
Mitglied: 139920
139920 May 31, 2019 at 11:15:31 (UTC)
Goto Top
Hier schon.