4 авг. 2011 г.

1С и WMI

Всплыла очередная проблема с функциональностью платформы 1С: нужно было реализовать запуск внешнего приложения вне зависимости от режима работы 1С. Стандартные методы ЗапуститьПриложение и КомандаСистемы не работают на сервере и во внешнем соединении. Выход был найден в использовании COM интерфейса к WMI:
WMI — это одна из базовых технологий для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows. WMI является открытой унифицированной системой интерфейсов доступа к любым параметрам операционной системы, устройствам и приложениям, которые функционируют в ней.
Практически, данной технологией можно заменить вызовы Windows API. Приведу пример работы в 1С:

Команда = "notepad.exe"; //это просто пример
Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
objWMIService = Locator.ConnectServer("."); //цепляемся к локальной системе
objStartup = objWMIService.Get("Win32_ProcessStartup");
objProcess = objWMIService.Get("Win32_Process");
intProcessID = 0;
intReturn = objProcess.Create(Команда, Null, Null, intProcessID);
If intReturn <> 0 Then
Сообщить("Ошибка выполнения: " + Команда); //если не клиент, том можно выводить сообщения в лог файл
EndIf;

Следует заметить, что есть подводные камни: данный код работает с привилегиями учетной записи от которой запущен сервер 1С (желательно не SYSTEM и подобные). В строке соединения Locator.ConnectServer можно указать удаленный хост, пользователя и пароль, однако по непонятной логике microsoft, передача пары логин/пароль не работает для локальной системы, только для удаленного хоста. Вызов Create не ожидает завершения работы программы, поэтому если требуется ожидать окончание работы или вывод программы, нужно реализовать отдельные механизмы.

Ссылки:
http://msdn.microsoft.com/en-us/library/aa384642%28VS.85%29.aspx
http://www.sysengineering.ru/Administration/AdministrationUsingWMI.aspx

Комментариев нет: