Ни для кого не секрет, что PowerShell умеет управлять принтерами. Для этого используются как WMI классы, так и COM объекты. При этом управление ими из PowerShell совсем не сложное. WMI представляет следующие классы:
Итак, самое простое - перечисление принтеров:
Write-Host "`tLocal Printers" gwmi win32_printer -Filter "Local='$true'" | ft Name, Drivername -a Write-Host "`tNetwork Printers" gwmi win32_printer -Filter "Local='$false'" | ft Name, Drivername, ServerName -a
Здесь я вывожу 2 списка принтеров - которые подключены локально и сетевые принтеры. Фильтрация осуществляется по свойству Local, которое может быть или $true или $false. Так же можно посмотреть, какие принтеры расшарены для других пользователей:
Write-Host "`tShared Printers" gwmi win32_printer -Filter "Shared='$true'" | ft Name, ShareName -a
Безусловно, как и остальные классы WMI, класс Win32_Printer позволяет удалённо подключаться к принтсерверу с использованием параметра -ComputerName.
Так же можно посмотреть текущие настройки принтера:
gwmi Win32_PrinterConfiguration | ft Caption, XResolution, YResolution, PaperSize -a
Этой командой я увижу основные параметры качества печати и текущий размер используемой бумаги. Дополнительные свойства описаны в классе Win32_PrinterConfiguration и описывать их тут смысла нету.
Классы Win32_PrinterDriver и Win32_PrinterDriverDll несут лишь справочную информацию о драйверах принтеров и реальное применение им я представляю слабо и рассматривать не буду.
Класс Win32_PrintJob показывает текущее состояние очереди печати принтера. Например, сейчас мой принтер печатает тестовую страницу:
[user name] gwmi Win32_Printjob | select * Document : Test Page JobId : 3 JobStatus : Printing Name : Новая оргтехника, 3 PagesPrinted : 0 Status : OK __GENUS : 2 __CLASS : Win32_PrintJob __SUPERCLASS : CIM_Job __DYNASTY : CIM_ManagedSystemElement __RELPATH : Win32_PrintJob.Name="Новая оргтехника, 3" __PROPERTY_COUNT : 24 __DERIVATION : {CIM_Job, CIM_LogicalElement, CIM_ManagedSystemElement} __SERVER : CAMELOT __NAMESPACE : root\cimv2 __PATH : \\CAMELOT\root\cimv2:Win32_PrintJob.Name="Новая оргтехника, 3" Caption : Новая оргтехника, 3 DataType : NT EMF 1.008 Description : Новая оргтехника, 3 DriverName : HP Photosmart D6100 series ElapsedTime : HostPrintQueue : \\CAMELOT InstallDate : Notify : user name Owner : user name Parameters : PrintProcessor : hpzpp4pi Priority : 1 Size : 114944 StartTime : StatusMask : 16 TimeSubmitted : 20081110195514.849000+120 TotalPages : 1 UntilTime :
Здесь видно, на какой принтер идёт печать, имя документа, статус печати, размер документа, имя пользователя, от которого производится печать и др. Кстати говоря, параметр JobId показывает количество отправленных заданий с момента последнего перезапуска спулера печати. Так же хочу заметить, что Win32_PrintJob возвращает информацию только при наличии заданий в спулере. Когда принтер простаивает, то данный класс ничего не возвращает.
Теперь настало время поговорить, как подключать новые принтеры и удалять текущие принтеры. Подключать принтеры можно как с помощью WMI, так и с помощью COM:
([wmiclass]'Win32_Printer').AddPrinterConnection("\\server\Printername")
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection("\\Server\PrinterName")
При этом важно отметить, что при получении объекта Win32_Printer в нём метод AddPrinterConnection не содержится, т.к. данный метод содержится в самом классе Win32_Printer.
Удаление принтера производится при помощи метода Delete:
(gwmi Win32_Printer -Filter "name='PrinterName'").delete()
Таким образом удаляется только один принтер. Все принтеры удаляются без указания фильтра:
(gwmi Win32_Printer).delete()
Например, недавно на ньюсгруппах был вопрос, как для развёртывания нового принтсервера удалить со всех компьютеров домена. Задача решалась в несколько строк:
$filter = "(objectcategory=computer)" $ds = New-object System.DirectoryServices.DirectorySearcher([ADSI]"",$filter) $computers = $ds.Findall() | %{$_.properties.name} foreach ($computer in $computers) {gwmi win32_printer -computername "$computer" | %{$_.delete()}
На сегодня, я думаю, это всё. Во второй части я планирую поговорить о чтении и установке пермишенов на принтеры с использованием PowerShell.
Отлично, жду продолжения.
Comments: