Имя: Пароль:
1C
1С v8
Как получить имена всех принтеров на сервере
0 SAURON777
 
09.08.18
16:53
Добрый день!
Как получить имена всех принтеров на сервере. В том числе перенаправленных. Нашел через поиск способы, но они не дают перенаправленные принтеры, а они тоже нужны. Прошу помочь.
1 Garykom
 
гуру
09.08.18
17:04
Сервер то на Linux'е надеюсь?
2 SAURON777
 
09.08.18
17:45
(1) Windows Server 2012
3 Garykom
 
гуру
09.08.18
17:47
(2) Плохо искал способы, они даже тут не форуме есть причем приколочены
4 Garykom
 
гуру
09.08.18
17:48
(3) *на форуме
5 kittystark
 
09.08.18
17:48
под винду

Перем Серверы;
Перем ScrptCtrl;

Процедура ПриОткрытии()
    ЗаполнитьСписокПринтеров();
КонецПроцедуры

Процедура ЗаполнитьСписокПринтеров()
    
    Серверы = Новый СписокЗначений;
    Серверы.Добавить("Omega"); //свои имена серверов
    Серверы.Добавить("Delta");
    
    Для инд1=1 по Серверы.количество() Цикл                      
        сервер = серверы.Получить(инд1-1 );
        Попытка
            m = ScrptCtrl.Modules.item("Global");
            co = m.CodeObject;
            Принтеры = co.prn_list(сервер.Значение);

            Для инд2=1 по СтрЧислоВхождений(принтеры, Символы.ПС) Цикл
                принтер = СтрПолучитьСтроку(принтеры, инд2);
                СтрокаТЗ = ТаблицаПринтеров.Добавить();
                СтрокаТЗ.Сервер = сервер;
                СтрокаТЗ.Принтер = принтер;
            КонецЦикла;
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;
    КонецЦикла;
       ТаблицаПринтеров.Сортировать("Принтер");
    
КонецПроцедуры    

Процедура ТаблицаПринтеровПередНачаломИзменения(Элемент, Отказ)
    
    Отказ = Истина;
    ответ = Вопрос("Очистить очередь печати на " + Элемент.ТекущаяСтрока.принтер + "?", РежимДиалогаВопрос.ДаНет);
    Если ответ = КодВозвратаДиалога.Да Тогда
        m2 = ScrptCtrl.eval("prn_CancelJobs(""" + Элемент.ТекущаяСтрока.принтер + """)");
    КонецЕсли;    

КонецПроцедуры

ScrptCtrl= Новый COMОбъект("MSScriptControl.ScriptControl");
ScrptCtrl.Language="VBScript";
ScrptCtrl.AddCode("
|
|function prn_list(strComputer)
|    set objWMIService = GetObject(""winmgmts:"" & ""{impersonationLevel=impersonate}!\\"" & strComputer & ""\root\cimv2"")
|    set colInstalledPrinters = objWMIService.ExecQuery(""Select * from Win32_Printer"")
|    s = """"
|    For Each objPrinter in colInstalledPrinters
|        s = s & objPrinter.DeviceID & vbCrLf
|    Next
|   prn_list = s
|end function
|
|function prn_CancelJobs(strPrinter)
|    strComputer = "".""
|    set objWMIService = GetObject(""winmgmts:"" & ""{impersonationLevel=impersonate}!\\"" & strComputer & ""\root\cimv2"")
|    set colInstalledPrinters = objWMIService.ExecQuery(""Select * from Win32_Printer"")
|    For Each objPrinter in colInstalledPrinters
|        If objPrinter.DeviceID = strPrinter then
|            objPrinter.CancelAllJobs()
|        End If
|    Next
|   prn_CancelJobs = 167
|end function
|
|");
6 SAURON777
 
09.08.18
17:57
Эти процедуры отображают перенаправленные принтеры?
7 kittystark
 
09.08.18
18:00
пробуй...
8 Cyberhawk
 
09.08.18
18:00
Такой возможности нет
9 kittystark
 
09.08.18
18:01
(6) у меня все принтера проброшенные через RDP показывались, а что ты имеешь в виду под словом "перенаправленные" - хз
10 Garykom
 
гуру
09.08.18
18:02
ВыборПринтеров = Новый СписокЗначений();
ВыборПринтеров.Очистить();
Сеть =  Новый COMОбъект ("WScript.Network");
Принтеры =  Сеть.EnumPrinterConnections();
i = 0;
Пока i < Принтеры.Count()-1 Цикл
    ВыборПринтеров.Добавить(СокрЛП(Принтеры.Item(i+1)), СокрЛП(Принтеры.Item(i+1)));
    i = i + 2;
КонецЦикла;