Задача включения и выключения компьютеров по расписанию. Компьютеры - моноблоки под windows, выполняющих задачу Киосков. Висят над кабинетом и должны быть включены утром и выключены в конце рабочего дня.
Особенности выполнения задачи - это управление временем включения и выключения из 1С по регламентному заданию
1. Предварительная подготовка на моноблоках:
а) в BIOS включение функции "wake On Lan" в enabled
б) создание пользователя с администраторскими правами и указания для него пароля. Для простоты работы на всех моноблоках одинаковый логин и пароль
в) в локальной политике безопасности добавить пользователя в разрешенных на выключение компьютера. Ввести: secpol.msc -> локальные политики -> Назначение прав пользователя
-> принудительное завершение работы из удаленной системы. Добавить созданного пользователя из предыдущего пункта
2. Список всех моноблоков хранятся в регистре сведений "СписокКиосков"
Измерения:
- ИмяКомпьютера - строка
ресурсы:
- IPтелевизор - строка
- МАСадресТелевизора - строка
Для удобства получения MAC адреса воспользуемся командой "arp -a" получив список ip и mac адресов сети. Можно было бы пойти дальше и воспользоваться командой ping для определения ip моноблока по имени, но это уже на любителя.
Пользователь заполнив ip адрес киоска по кнопке "Получить MAC адрес по IP" получает MAC адрес, который понадобиться для включения.
На форме записи добавим кнопку "Получить MAC адрес по IP" с кодом:
&НаКлиенте
Процедура ЗаполнитьМАС(Команда)
ЗаполнитьМАСНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьМАСНаСервере()
// проверим что ip заполнен
Если не ЗначениеЗаполнено(запись.IPтелевизор) тогда
сообщить("Заполните ip телевизора");
возврат;
конецесли;
// запустим команду windows arp -a для получения списка компьютеров с IP и MAC в сети
имяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
имяКоманды = "cmd /c arp -a -> "+имяВременногоФайла;
ЗапуститьПриложение(имяКоманды, ,истина);
// найдем в реестре мас адрес и запишем
Текст = Новый ЧтениеТекста;
Текст.Открыть(имяВременногоФайла);
Строка = Текст.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл //строки читаются до символа перевода строки
Позиция = Найти(Строка, запись.IPтелевизор);
Если Позиция > 0 Тогда
Значение = СокрЛП(Сред(Строка, 22, 21));
запись.МАСадресТелевизора = СтрЗаменить(значение, "-", "");
прервать;
КонецЕсли;
Строка = Текст.ПрочитатьСтроку();
КонецЦикла;
Текст.Закрыть();
// удалим временный файл
УдалитьФайлы(имяВременногоФайла);
Модифицированность = Истина;
КонецПроцедуры
3. Регламентное задание ВКЛЮЧЕНИЯ компьютера
Для включения компьютера нужно выполнить команду broadc.exe с указанием MAC адреса.
Предварительно в программу 1С добавляем в общий макет с именем "broadc" файл broadc.exe
Файл можно скачать бесплатно с интернета или со вложения этой статьи.
Пример выполнения команды: broadc.exe ecd68ae6272b 255.255.255.255 67
Добавим в 1С регламентное задание со следующим кодом:
Процедура ВключитьКиоски() Экспорт
//1. сохраним файл broadc во временный файл
имяbroadc = ПолучитьИмяВременногоФайла("exe");
ДД = ПолучитьОбщийМакет("broadc");
ДД.Записать(имяbroadc);
Путь = ПолучитьИмяВременногоФайла("bat");
ФайлBat = Новый ЗаписьТекста(Путь);
// 2. включим компьютеры
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СписокКиосков.МАСадресТелевизора КАК МАСадресТелевизора
|ИЗ
| РегистрСведений.СписокКиосков КАК СписокКиосков";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ИмяКоманды = ""+имяbroadc+" "+ВыборкаДетальныеЗаписи.МАСадресТелевизора+ " 255.255.255.255 67";
ФайлBat.ЗаписатьСтроку(ИмяКоманды);
КонецЦикла;
ФайлBat.Закрыть();
// уберем BOM
Данные = Новый ДвоичныеДанные(Путь);
Строка64=Base64Строка(Данные);
Строка64=Прав(Строка64,СтрДлина(Строка64)-4); // убираем BOM символы
ДанныеНаЗапись=Base64Значение(Строка64);
ДанныеНаЗапись.Записать(Путь); // записываем
// 3. запустим bat файл
попытка
ЗапуститьПриложение(Путь,,истина);
исключение
ЗаписьЖурналаРегистрации("Включить Киоски", УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки(), РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная);
конецпопытки;
//3. удалим временный файл broadc
УдалитьФайлы(имяbroadc);
УдалитьФайлы(Путь);
КонецПроцедуры
4. Регламентное задание ВЫКЛЮЧЕНИЯ компьютера
Для выключения компьютера используется команда shutdown. Предварительно подключение осуществляется к киоску через net use с указанием логина и пароля.
Процедура РасшБит_ВыключитьКиоски() Экспорт
!! логинКиоска = укажите имя пользователя для киоска ;
!! парольКиоска = укажите пароль для киоска;
// 1. выберем ip киосков
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СписокКиосков.IPтелевизор КАК IPтелевизор,
| СписокКиосков.ИмяКомпьютера КАК ИмяКомпьютера
|ИЗ
| РегистрСведений.СписокКиосков КАК СписокКиосков";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
// 2. создадим bat временный файл
Путь = ПолучитьИмяВременногоФайла("bat");
ФайлBat = Новый ЗаписьТекста(Путь);
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ip = ВыборкаДетальныеЗаписи.IPтелевизор;
ИмяКомпьютера = ВыборкаДетальныеЗаписи.ИмяКомпьютера;
ФайлBat.ЗаписатьСтроку("net use \\"+ip+" /u:"+ИмяКомпьютера+"\"+логинКиоска +" "+ парольКиоска);
ФайлBat.ЗаписатьСтроку("shutdown /s /t 10 /f /m \\"+ip);
ФайлBat.ЗаписатьСтроку("net use \\"+ip+" /delete");
КонецЦикла;
ФайлBat.Закрыть();
// уберем BOM
Данные = Новый ДвоичныеДанные(Путь);
Строка64=Base64Строка(Данные);
Строка64=Прав(Строка64,СтрДлина(Строка64)-4); // убираем BOM символы
ДанныеНаЗапись=Base64Значение(Строка64);
ДанныеНаЗапись.Записать(Путь); // записываем
// 3. запустим bat файл
попытка
ЗапуститьПриложение(Путь,,истина);
исключение
ЗаписьЖурналаРегистрации("Выключить Киоски", УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки(), РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная);
конецпопытки;
// 4. удалим bat файл
УдалитьФайлы(Путь);
КонецПроцедуры
Код тестировался на платформе 8.3.24.1368.