Написан сервер COM+ на C# (на основе ServicedComponent).
Сейчас развертывание происходит так:
1. Копируются DLL на сервер (Windows Server 2008 R2).
2. Запускаются RegAsm и RegSvsc.
3. Затем через консоль "Службы компонентов" он добавляется и долго ручками настраивается (служба, безопасность, доступы и пр.) — после танцев с бубном все работает.
Вопрос — как автоматизировать п.3, т.к. разверка предполагается на нескольких компьютерах?
Или может быть имеет смысл написать сервис на основе ServiceBase (для этого есть готовый паттерн с генерирующимся инсталятором) и с него регистрировать объект COM+ (с учетом старт/пауза/стоп/выход)?
Тем более, что у службы предполагается иконка в трее.
Или посоветуйте другую технологию взаимодействия...
Смысл приложения — запускать по запросам клиента (одного) тяжелые задачи (длительностью от нескольких минут до недели), копить результаты в очереди и выдавать их по запросу.
Трафик с точки зрения объема данных и частоты запросов — ничтожный.
За идеи и ссылки буду благодарен... спасибо.
Re: Как программно запустить COM+ в виде службы на сервере?
Здравствуйте, mDmitriy, Вы писали:
D>Вопрос — как автоматизировать п.3
Я делал так: ручками создавал security descriptor, добавлял туда права
(COM_RIGHTS_EXECUTE_LOCAL и т.п.) для нужных пользователей и групп, а затем
сохранял дескриптор в ключе AppId\<GUID>\LaunchPermission и AccessPermission.
Это полностью эквивалентно ручной настройке доступа через утилиту dcomcnfg
(проверено на XP-Win7, 32-64).
D>Тем более, что у службы предполагается иконка в трее.
Если что, из службы не получится показывать иконки.
Ну разве что на системах до Vista, с установленным флагом "разрешить
взаимодействие с рабочим столом", но это жуткий костыль.
Re[2]: Как программно запустить COM+ в виде службы на сервере?
Здравствуйте, okman, Вы писали:
O>Я делал так: ручками создавал security descriptor, добавлял туда права O>(COM_RIGHTS_EXECUTE_LOCAL и т.п.) для нужных пользователей и групп, а затем O>сохранял дескриптор в ключе AppId\<GUID>\LaunchPermission и AccessPermission. O>Это полностью эквивалентно ручной настройке доступа через утилиту dcomcnfg O>(проверено на XP-Win7, 32-64).
Понятно, спасибо...
Но мне это не подходит, ибо все равно каждый сервер настраивать, проще админа посадить
Хочется все один раз и из инсталятора...
D>>Тем более, что у службы предполагается иконка в трее.
O>Если что, из службы не получится показывать иконки. O>Ну разве что на системах до Vista, с установленным флагом "разрешить O>взаимодействие с рабочим столом", но это жуткий костыль.
Э-э... а почему, собственно, костыль?
Куча современных программ под Windows так и работает... В том числе и на WinServer 2008/2012
И флаг "разрешить взаимодействие с рабочим столом" никуда не делся в последних версиях.
Re: Как программно запустить COM+ в виде службы на сервере?
D>За идеи и ссылки буду благодарен... спасибо.
Забудьте о COM и тем более о COM+.
Сделайте обычное приложение и в нём обычный REST сервис которыц по запросу будет запускать таски и ложить куда то результат их выполнения, в базу, в файл, куда угодно. Затем этот же рест сервис может вернуть результат работы таска по его ID.
Народная мудрось
всем все никому ничего(с).
Re[2]: Как программно запустить COM+ в виде службы на сервере?
Здравствуйте, Tom, Вы писали:
D>>За идеи и ссылки буду благодарен... спасибо. Tom>Забудьте о COM и тем более о COM+.
Почему? Tom>Сделайте обычное приложение и в нём обычный REST сервис которыц по запросу будет запускать таски и ложить куда то результат их выполнения, в базу, в файл, куда угодно. Затем этот же рест сервис может вернуть результат работы таска по его ID.
Можно какую-нибудь ссылку на пример сервера/клиента на С#?
Re[3]: Как программно запустить COM+ в виде службы на сервере?
Здравствуйте, mDmitriy, Вы писали:
O>>Если что, из службы не получится показывать иконки. O>>Ну разве что на системах до Vista, с установленным флагом "разрешить O>>взаимодействие с рабочим столом", но это жуткий костыль.
D>Э-э... а почему, собственно, костыль? D>Куча современных программ под Windows так и работает... В том числе и на WinServer 2008/2012 D>И флаг "разрешить взаимодействие с рабочим столом" никуда не делся в последних версиях.
Я повторю — из службы не получится показывать никакие иконки.
Просто к тому, чтобы зря не тратили на это время.
Даже на XP/Server2003 службы по дефолту работают в другой оконной станции, а
начиная с Vista — в отдельной нулевой сессии. И данный флаг на Vista и выше
уже ничем не поможет, в лучшем случае получите сообщение от UI0Detect.exe.
"Куча современных программ" используют выделенный GUI-шный процесс, и это,
видимо, единственно возможное и правильное в такой ситуации решение.
Re[3]: Как программно запустить COM+ в виде службы на сервере?
Здравствуйте, okman, Вы писали:
O>Здравствуйте, mDmitriy, Вы писали:
D>>Но мне это не подходит, ибо все равно каждый сервер настраивать, проще админа посадить
O>Зачем настраивать ? O>Все можно сделать программно.
А можно примерчик или ссылку?
Re[4]: Как программно запустить COM+ в виде службы на сервере?
Здравствуйте, okman, Вы писали:
O>Даже на XP/Server2003 службы по дефолту работают в другой оконной станции, а O>начиная с Vista — в отдельной нулевой сессии. И данный флаг на Vista и выше O>уже ничем не поможет, в лучшем случае получите сообщение от UI0Detect.exe.
O>"Куча современных программ" используют выделенный GUI-шный процесс, и это, O>видимо, единственно возможное и правильное в такой ситуации решение.
Понятно, спасибо...
Re[5]: Как программно запустить COM+ в виде службы на сервере?
Здравствуйте, mDmitriy, Вы писали:
O>>Все можно сделать программно.
D>А можно примерчик или ссылку?
Для начала нужно создать два дескриптора безопасности, один для
LaunchPermission, второй для AccessPermission. Можно использовать
функцию BuildSecurityDescriptor, например, ну или какую другую,
главное, чтобы дескриптор в итоге был в формате self-relative.
Далее в каждый дескриптор нужно добавить соответствующие элементы
доступа (ACL) для нужных пользователей. В файле ObjBase.h (стандартный
заголовок из Windows SDK) определены такие константы:
Как нетрудно догадаться, эти значения соответствуют одноименным правам доступа,
настраиваемым в "DCOM Config" на вкладке "Security" — "Local Launch", "Remote Launch",
"Local Activation" и "Remote Activation". На счет COM_RIGHTS_EXECUTE точно не
помню, но кажется, он должен присутствовать и там, и там, в любом случае.
Могу ошибаться (за давностью подзабыл), но это легко проверяется.
Пусть, например, нужно дать всем (группа "Everyone") права "Local Launch" и
"Local Activation". Тогда список контроля доступа будет примерно таким:
LaunchPermission
DACL = Access Allowed, Rights = 0x3 (COM_RIGHTS_EXECUTE + COM_RIGHTS_EXECUTE_LOCAL), World SID
AccessPermission
DACL = Access Allowed, Rights = 0x9 (COM_RIGHTS_EXECUTE + COM_RIGHTS_ACTIVATE_LOCAL), World SID
Сформированные дескрипторы безопасности следует сохранить как REG_BINARY в
ключе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{GUID Компонента} в
значениях LaunchPermission и AccessPermission.
Re[5]: Как программно запустить COM+ в виде службы на сервере?
Здравствуйте, mDmitriy, Вы писали:
D>Здравствуйте, Tom, Вы писали:
D>>>За идеи и ссылки буду благодарен... спасибо. Tom>>Забудьте о COM и тем более о COM+. D>Почему? Tom>>Сделайте обычное приложение и в нём обычный REST сервис которыц по запросу будет запускать таски и ложить куда то результат их выполнения, в базу, в файл, куда угодно. Затем этот же рест сервис может вернуть результат работы таска по его ID. D>Можно какую-нибудь ссылку на пример сервера/клиента на С#?
Здравствуйте, TK, Вы писали: Tom>>>Забудьте о COM и тем более о COM+. D>>Почему?
TK>COM+ это достаточно "толстая" зависимость. Что из него вам реально нужно?
возможность синхронно работать с объектами впрямую (без сериализаций) по принципу метод->эвент. TK>PS TK>Настроенное COM+ приложение раньше всегда можно было "экспортировать"
Это во многом решает, спасибо...
Re[4]: Как программно запустить COM+ в виде службы на сервере?
Здравствуйте, AndrewVK, Вы писали: Tom>>>Забудьте о COM и тем более о COM+. D>>Почему? AVK>Хотя бы потому что System.EnterpriseServices не поддерживаются нынче.
а что предлагают взамен? или подобных технологий вообще больше не будет?
D>>Можно какую-нибудь ссылку на пример сервера/клиента на С#? AVK>http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api
требует VS 2013 и .NET 4.5, увы...
Re[5]: Как программно запустить COM+ в виде службы на сервере?
Здравствуйте, Tom, Вы писали:
D>>За идеи и ссылки буду благодарен... спасибо. Tom>Забудьте о COM и тем более о COM+. Tom>Сделайте обычное приложение и в нём обычный REST сервис которыц по запросу будет запускать таски и ложить куда то результат их выполнения, в базу, в файл, куда угодно. Затем этот же рест сервис может вернуть результат работы таска по его ID.
А как гарантировать, что это приложение будет всегда запускаться вместе с сервером? И под какой учёткой его запускать? Сдаётся мне, мы тут снова возвращаемся к обычной службе.