Как программно запустить COM+ в виде службы на сервере?
От: mDmitriy Россия  
Дата: 20.08.14 06:18
Оценка:
Всем привет!

Написан сервер COM+ на C# (на основе ServicedComponent).
Сейчас развертывание происходит так:
1. Копируются DLL на сервер (Windows Server 2008 R2).
2. Запускаются RegAsm и RegSvsc.
3. Затем через консоль "Службы компонентов" он добавляется и долго ручками настраивается (служба, безопасность, доступы и пр.) — после танцев с бубном все работает.
Вопрос — как автоматизировать п.3, т.к. разверка предполагается на нескольких компьютерах?

Или может быть имеет смысл написать сервис на основе ServiceBase (для этого есть готовый паттерн с генерирующимся инсталятором) и с него регистрировать объект COM+ (с учетом старт/пауза/стоп/выход)?
Тем более, что у службы предполагается иконка в трее.

Или посоветуйте другую технологию взаимодействия...
Смысл приложения — запускать по запросам клиента (одного) тяжелые задачи (длительностью от нескольких минут до недели), копить результаты в очереди и выдавать их по запросу.
Трафик с точки зрения объема данных и частоты запросов — ничтожный.

За идеи и ссылки буду благодарен... спасибо.
Re: Как программно запустить COM+ в виде службы на сервере?
От: okman Беларусь https://searchinform.ru/
Дата: 20.08.14 10:09
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:

D>Вопрос — как автоматизировать п.3


Я делал так: ручками создавал security descriptor, добавлял туда права
(COM_RIGHTS_EXECUTE_LOCAL и т.п.) для нужных пользователей и групп, а затем
сохранял дескриптор в ключе AppId\<GUID>\LaunchPermission и AccessPermission.
Это полностью эквивалентно ручной настройке доступа через утилиту dcomcnfg
(проверено на XP-Win7, 32-64).

D>Тем более, что у службы предполагается иконка в трее.


Если что, из службы не получится показывать иконки.
Ну разве что на системах до Vista, с установленным флагом "разрешить
взаимодействие с рабочим столом", но это жуткий костыль.
Re[2]: Как программно запустить COM+ в виде службы на сервере?
От: mDmitriy Россия  
Дата: 20.08.14 14:41
Оценка: :)
Здравствуйте, 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+ в виде службы на сервере?
От: Tom Россия http://www.RSDN.ru
Дата: 20.08.14 14:44
Оценка: +3
D>За идеи и ссылки буду благодарен... спасибо.
Забудьте о COM и тем более о COM+.
Сделайте обычное приложение и в нём обычный REST сервис которыц по запросу будет запускать таски и ложить куда то результат их выполнения, в базу, в файл, куда угодно. Затем этот же рест сервис может вернуть результат работы таска по его ID.
Народная мудрось
всем все никому ничего(с).
Re[2]: Как программно запустить COM+ в виде службы на сервере?
От: mDmitriy Россия  
Дата: 20.08.14 15:00
Оценка:
Здравствуйте, Tom, Вы писали:

D>>За идеи и ссылки буду благодарен... спасибо.

Tom>Забудьте о COM и тем более о COM+.
Почему?
Tom>Сделайте обычное приложение и в нём обычный REST сервис которыц по запросу будет запускать таски и ложить куда то результат их выполнения, в базу, в файл, куда угодно. Затем этот же рест сервис может вернуть результат работы таска по его ID.
Можно какую-нибудь ссылку на пример сервера/клиента на С#?
Re[3]: Как программно запустить COM+ в виде службы на сервере?
От: okman Беларусь https://searchinform.ru/
Дата: 20.08.14 16:13
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:

O>>Если что, из службы не получится показывать иконки.

O>>Ну разве что на системах до Vista, с установленным флагом "разрешить
O>>взаимодействие с рабочим столом", но это жуткий костыль.

D>Э-э... а почему, собственно, костыль?

D>Куча современных программ под Windows так и работает... В том числе и на WinServer 2008/2012
D>И флаг "разрешить взаимодействие с рабочим столом" никуда не делся в последних версиях.

Я повторю — из службы не получится показывать никакие иконки.
Просто к тому, чтобы зря не тратили на это время.

Даже на XP/Server2003 службы по дефолту работают в другой оконной станции, а
начиная с Vista — в отдельной нулевой сессии. И данный флаг на Vista и выше
уже ничем не поможет, в лучшем случае получите сообщение от UI0Detect.exe.

"Куча современных программ" используют выделенный GUI-шный процесс, и это,
видимо, единственно возможное и правильное в такой ситуации решение.
Re[3]: Как программно запустить COM+ в виде службы на сервере?
От: okman Беларусь https://searchinform.ru/
Дата: 20.08.14 16:15
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Но мне это не подходит, ибо все равно каждый сервер настраивать, проще админа посадить


Зачем настраивать ?
Все можно сделать программно.
Re[4]: Как программно запустить COM+ в виде службы на сервере?
От: mDmitriy Россия  
Дата: 21.08.14 09:09
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, mDmitriy, Вы писали:


D>>Но мне это не подходит, ибо все равно каждый сервер настраивать, проще админа посадить


O>Зачем настраивать ?

O>Все можно сделать программно.
А можно примерчик или ссылку?
Re[4]: Как программно запустить COM+ в виде службы на сервере?
От: mDmitriy Россия  
Дата: 21.08.14 09:11
Оценка:
Здравствуйте, okman, Вы писали:

O>Даже на XP/Server2003 службы по дефолту работают в другой оконной станции, а

O>начиная с Vista — в отдельной нулевой сессии. И данный флаг на Vista и выше
O>уже ничем не поможет, в лучшем случае получите сообщение от UI0Detect.exe.

O>"Куча современных программ" используют выделенный GUI-шный процесс, и это,

O>видимо, единственно возможное и правильное в такой ситуации решение.
Понятно, спасибо...
Re[5]: Как программно запустить COM+ в виде службы на сервере?
От: okman Беларусь https://searchinform.ru/
Дата: 21.08.14 15:49
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:

O>>Все можно сделать программно.


D>А можно примерчик или ссылку?


Для начала нужно создать два дескриптора безопасности, один для
LaunchPermission, второй для AccessPermission. Можно использовать
функцию BuildSecurityDescriptor, например, ну или какую другую,
главное, чтобы дескриптор в итоге был в формате self-relative.

Далее в каждый дескриптор нужно добавить соответствующие элементы
доступа (ACL) для нужных пользователей. В файле ObjBase.h (стандартный
заголовок из Windows SDK) определены такие константы:
#define COM_RIGHTS_EXECUTE 1
#define COM_RIGHTS_EXECUTE_LOCAL 2
#define COM_RIGHTS_EXECUTE_REMOTE 4
#define COM_RIGHTS_ACTIVATE_LOCAL 8
#define COM_RIGHTS_ACTIVATE_REMOTE 16

Как нетрудно догадаться, эти значения соответствуют одноименным правам доступа,
настраиваемым в "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+ в виде службы на сервере?
От: okman Беларусь https://searchinform.ru/
Дата: 21.08.14 19:52
Оценка: 3 (1)
P.S.
Значения прав доступа для AppID/LaunchPermission & AccessPermission
(получены экспериментальным путем на XP-Srv2003-Vista-7):
LaunchPermission

    Local Launch      - 0x3
    Remote Launch     - 0x5
    Local Activation  - 0x9
    Remote Activation - 0x11
    
AccessPermission

    Local Access      - 0x3
    Remote Access     - 0x5
Re[6]: Как программно запустить COM+ в виде службы на сервере?
От: mDmitriy Россия  
Дата: 22.08.14 05:16
Оценка:
Огромное спасибо!
Re[3]: Как программно запустить COM+ в виде службы на сервере?
От: Danchik Украина  
Дата: 22.08.14 13:22
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:

D>Здравствуйте, Tom, Вы писали:


D>>>За идеи и ссылки буду благодарен... спасибо.

Tom>>Забудьте о COM и тем более о COM+.
D>Почему?
Tom>>Сделайте обычное приложение и в нём обычный REST сервис которыц по запросу будет запускать таски и ложить куда то результат их выполнения, в базу, в файл, куда угодно. Затем этот же рест сервис может вернуть результат работы таска по его ID.
D>Можно какую-нибудь ссылку на пример сервера/клиента на С#?

WCF
http://tech.pro/tutorial/855/wcf-tutorial-basic-interprocess-communication

Thrift
http://habrahabr.ru/post/106839/

ZeroMQ
http://www.codeproject.com/Articles/488207/ZeroMQ-via-Csharp-Introduction

И куча другого
Re[3]: Как программно запустить COM+ в виде службы на сервере?
От: TK Лес кывт.рф
Дата: 23.08.14 07:36
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:


D>>>За идеи и ссылки буду благодарен... спасибо.

Tom>>Забудьте о COM и тем более о COM+.
D>Почему?

COM+ это достаточно "толстая" зависимость. Что из него вам реально нужно?
PS
Настроенное COM+ приложение раньше всегда можно было "экспортировать"
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как программно запустить COM+ в виде службы на сервере?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.08.14 00:47
Оценка:
Здравствуйте, mDmitriy, Вы писали:

Tom>>Забудьте о COM и тем более о COM+.

D>Почему?

Хотя бы потому что System.EnterpriseServices не поддерживаются нынче.

D>Можно какую-нибудь ссылку на пример сервера/клиента на С#?


http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[4]: Как программно запустить COM+ в виде службы на сервере?
От: mDmitriy Россия  
Дата: 25.08.14 05:37
Оценка:
Здравствуйте, Danchik, Вы писали:

D>WCF http://tech.pro/tutorial/855/wcf-tutorial-basic-interprocess-communication

пробовал — работает, но слишком мощная система и были проблемы с callback от сервера к клиенту.

D>Thrift http://habrahabr.ru/post/106839/

Очень экзотично... опять-таки — многоязыковость мне не нужна, кодогенератор не генерит интерфейсов.

D>ZeroMQ http://www.codeproject.com/Articles/488207/ZeroMQ-via-Csharp-Introduction

асинхронно...
D>И куча другого
Спасибо
Re[4]: Как программно запустить COM+ в виде службы на сервере?
От: mDmitriy Россия  
Дата: 25.08.14 05:40
Оценка:
Здравствуйте, TK, Вы писали:
Tom>>>Забудьте о COM и тем более о COM+.
D>>Почему?

TK>COM+ это достаточно "толстая" зависимость. Что из него вам реально нужно?

возможность синхронно работать с объектами впрямую (без сериализаций) по принципу метод->эвент.
TK>PS
TK>Настроенное COM+ приложение раньше всегда можно было "экспортировать"
Это во многом решает, спасибо...
Re[4]: Как программно запустить COM+ в виде службы на сервере?
От: mDmitriy Россия  
Дата: 25.08.14 06:01
Оценка:
Здравствуйте, 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+ в виде службы на сервере?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.08.14 09:36
Оценка:
Здравствуйте, mDmitriy, Вы писали:

AVK>>Хотя бы потому что System.EnterpriseServices не поддерживаются нынче.

D>а что предлагают взамен?

WCF и WebAPI.

D>>>Можно какую-нибудь ссылку на пример сервера/клиента на С#?

AVK>>http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api
D>требует VS 2013 и .NET 4.5, увы...

Нет. WebAPI доступно начиная с 4.0, емнип. Поддержку 4.0 дропнули только в самой последней версии.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[2]: Как программно запустить COM+ в виде службы на сервере?
От: Vladek Россия Github
Дата: 14.09.14 05:30
Оценка:
Здравствуйте, Tom, Вы писали:

D>>За идеи и ссылки буду благодарен... спасибо.

Tom>Забудьте о COM и тем более о COM+.
Tom>Сделайте обычное приложение и в нём обычный REST сервис которыц по запросу будет запускать таски и ложить куда то результат их выполнения, в базу, в файл, куда угодно. Затем этот же рест сервис может вернуть результат работы таска по его ID.

А как гарантировать, что это приложение будет всегда запускаться вместе с сервером? И под какой учёткой его запускать? Сдаётся мне, мы тут снова возвращаемся к обычной службе.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.