Альтернатива WMI для запросов общих принтеров

У меня есть среда с несколькими сотнями компьютеров. Я пытаюсь записать vBscript, который выполняет и добавляет соответствующий принтер. Названия принтера могут быть определены с помощью подсказок об имени компьютера. Мой сценарий (немного грязный из-за отладки) следующие:

'Key vars
printServer = "SERVER"

Set WshNetwork = CreateObject("WScript.Network")

'Extract computer name and take the first two fields
cNameParts=Split(WshNetwork.ComputerName,"-")
printerNamePrefix = cNameParts(0) + "-P" + cNameParts(1)


Set objWMIService = GetObject("winmgmts:\\" & printServer & "\root\cimv2") 
Set colItems = objWMIService.ExecQuery("Select Name from Win32_Printer WHERE Name LIKE '" + printerNamePrefix + "-%'",,48)
'Set colItems = objWMIService.ExecQuery("Select Name from Win32_Printer",,48)

Wscript.Echo "Done querying.."
printerName = ""


For Each printerObj in colItems
    printerName = printerObj.Name
    Wscript.Echo printerName
Next


PrinterPath = "\\" + UCASE(printServer) + "\" + printerName
Wscript.Echo "Adding " + PrinterPath
WshNetwork.AddWindowsPrinterConnection PrinterPath, PrinterDriver
WshNetwork.SetDefaultPrinter PrinterPath 

Теперь WMI, кажется, является крайне медленным и привязывает ЦП на сервере. Когда я комментирую первый запрос и некомментирую второе (для перечисления всех принтеров), это, кажется, буферизует путем вывода:

PRINTER_NAME
PRINTER_NAME
PRINTER_NAME
PRINTER_NAME
PRINTER_NAME
PRINTER_NAME
PRINTER_NAME
(wait a few sec)
PRINTER_NAME
PRINTER_NAME
PRINTER_NAME
PRINTER_NAME
PRINTER_NAME
PRINTER_NAME
PRINTER_NAME
(wait a few sec)

Я знаю, что асинхронные возвраты WMI, вот почему "сделанные запросы" печатают сначала. Теперь, по-видимому, "сетевое представление" не использует WMI, так как это супер быстро. Я мог записать VBScript для парсинга "сетевого представления", но это кажется очень неуклюжим. Существует ли лучший путь?

0
задан 26 February 2014 в 15:17
1 ответ

"Win32_Printer" и "net view" опрашивают различные объекты. "Win32_Printer" перечислит все установленные объекты принтера и может быть довольно медленным на серверах печати. Это приведет к появлению большого количества хороших данных и некоторых функций управления. Однако, вас интересуют только имена очередей, так что, скорее всего, это перебор для ваших нужд. С другой стороны, "net view" запрашивает список общих объектов. Он не возвращает почти столько же данных и не выставляет какие-либо функции управления, но работает намного быстрее. Вы можете имитировать это с помощью WMI, используя объект "Win32_Share".

Для вашего кода попробуйте изменить WMI-запрос с

Set colItems = objWMIService.ExecQuery("Select Name from Win32_Printer WHERE Name LIKE '" + printerNamePrefix + "-%'",,48)

на

Set colItems = objWMIService.ExecQuery("Select Name from Win32_Share WHERE Name LIKE '" + printerNamePrefix + "-%'",,48)

Обратите внимание, что я только что изменил 'Win32_Printer' на 'Win32_Share'. Это запросит список разделяемых объектов на сервере и должно работать намного быстрее. Однако предупреждаем, что это вернет только список SHARED принтеров. Вероятно, это нормально для сервера печати, где принтеры, которые вас интересуют, также являются общими.

.
1
ответ дан 4 December 2019 в 17:48

Теги

Похожие вопросы