Dodawanie drukarek z PowerShella

Ostatnio bawiliśmy się modyfikowaniem domyślnych drukarek. Natomiast dziś przedstawię jak można zarządzać drukarkami, tzn. dodać czy udostępnić drukarkę innym. Mając lokalny dostęp do maszyny nie jest to problem, by wykonać taką operację przy użyciu kilku kliknięć. Niemniej jednak gdy chcemy zrobić coś podobnego na masową skalę, np. do kilkuset maszyn to zaczyna nam się rodzić problem. Oczywiście wszystko to da się zrobić z poziomu Active Directory, a konkretnie przy wykorzystaniu GPO, ale jak wiadomo ja lubię rozwiązania mniej konwencjonalne 🙂

Zanim jednak przejdziemy do działania przedstawmy kilka przypadków:

  • Udostępnienie drukarki lokalnej na zdalnej maszynie, a następnie dodanie jej
  • Dodanie drukarki sieciowej

Jak w poprzednim przypadku, to również i dziś będziemy operować na klasie Win32_Printer.

W celu udostępnienia drukarki lokalnej (nawet w przypadku zdalnej maszyny) szukamy odpowiedniego wpisu w WMI i przypisujemy tą instancję do zmiennej.

$Printer = Get-WmiObject -ComputerName 10.10.10.102 -Class Win32_Printer -Filter "name='hp deskjet 5550 series'"

Sprawdzamy wartość atrybutów Shared oraz ShareName

$Printer | select Name, Shared, ShareName

Jeśli jest wartość $false oraz brak nazwy to modyfikujemy oba atrybuty:

$Printer.Shared = $true
$Printer.ShareName = $Printer.Name

Całość zatwierdzamy metodą Put()

$Printer.Put()

Gdy mamy już zdalnie udostępnioną drukarkę, przejdźmy do dodania jej na innej maszynie.

Teoretycznie możemy użyć metody dostarczonej do klasy WMI Win32_Printer, a mianowicie AddPrinterConnection. Jedyny parametr jaki musimy podać to lokalizacja drukarki w sieci.

$NewPrinter = [WMIClass]"\\$RemoteMachine\root\cimv2:Win32_Printer"
$NewPrinter.AddPrinterConnection("\\$PrintServer\$PrinterShareName")

Niestety metoda ta więcej razy mnie zawodziła, aniżeli była przydatna.

Niemniej jednak można podejść do sprawy inaczej, poprzez „Ręczne” utworzenie nowej instancji drukarki. Jak dotąd zawsze metoda ta sprawdzała się.

W tym momencie oba nasze scenariusze się scalają, gdyż tą metodę można zastosować zarówno do udostępnionej lokalnej drukarki jak i do klasycznej drukarki sieciowej.

Do celów prezentacji wykonywał będę to na lokalnej maszynie, ale można to przenieść na dowolną maszynę, z obsługą WMI – wystarczy zmiana w adresie „.” symbolizującej localhosta na nazwę zdalnej maszyny.

Tworzymy więc nową instancję klasy portu drukarki.

$NewPrinterPort = ([WMICLASS]"\\.\ROOT\cimv2:Win32_TCPIPPrinterPort").createInstance()
$NewPrinterPort.HostAddress = "10.10.10.102"
$NewPrinterPort.Name = "IP_10.10.10.102"
$NewPrinterPort.PortNumber = 9100
$NewPrinterPort.Protocol = 1
$NewPrinterPort.SNMPEnabled=$false
$NewPrinterPort.Put()

Następnie gdy posiadamy już utworzony port drukarki, przystępujemy do tworzenia nowej instancji samej drukarki.

$NewLocalPrinter = ([WMICLASS]"\\.\ROOT\cimv2:Win32_Printer").createInstance()
$NewLocalPrinter.DriverName = "hp deskjet 5550 series (HPA)"
$NewLocalPrinter.PortName = "IP_10.10.10.102"
$NewLocalPrinter.DeviceID = "hp deskjet 5550 series (HPA)"
$NewLocalPrinter.Network = $false
$NewLocalPrinter.Shared = $false
$NewLocalPrinter.ShareName = ""
$NewLocalPrinter.Put()

Natomiast dla drukarek sieciowych jest prawie identycznie z tym wyjątkiem, iż atrybut network ustawiamy na $true. Oczywiście wcześniej również tworząc odpowiedni port TCPIP do takiej drukarki.

$NewNetworkPrinter = ([WMICLASS]"\\.\ROOT\cimv2:Win32_Printer").createInstance()
$NewNetworkPrinter.DriverName = "Ricoh Aficio MP 161 PCL"
$NewNetworkPrinter.PortName = "IP_10.10.10.135"
$NewNetworkPrinter.DeviceID = "Ricoh Aficio MP 161 PCL"
$NewNetworkPrinter.Network = $true
$NewNetworkPrinter.Shared = $true
$NewNetworkPrinter.ShareName = "Ricoh Aficio MP 161 PCL"
$NewNetworkPrinter.Put()

Na zakończenie możemy użyć metody PrintTestPage w celu sprawdzenia czy wszystko faktycznie przebiegło pomyślnie.

$NewNetworkPrinter.PrintTestPage()

Dodaj komentarz