Ни для кого не секрет, что 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: