Contents of this directory is archived and no longer updated.

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

  • WMI
([wmiclass]'Win32_Printer').AddPrinterConnection("\\server\Printername")
  • COM
(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.


Share this article:

Comments:

http://mazayblog.wordpress.com/

Отлично, жду продолжения.

Comments are closed.