InterExServices COMException при запуске приложения .net из веб-сценария CGI в Windows Server 2003 - PullRequest
0 голосов
/ 21 мая 2009

Отказ от ответственности: я совершенно не разбираюсь в .net и COM.

У меня есть приложение вендора, которое, кажется, написано в .net, и я пытаюсь обернуть его веб-формой (скрипт Perl cgi-bin), чтобы я мог в конечном итоге запустить приложение этого вендора с отдельного компьютера. Я работаю в системе Windows Server 2003 R2 SE SP1 и использую Apache 2.2 для веб-сервера и ActivePerl 5.10.0.1004 для скрипта cgi. Мой скрипт cgi вызывает приложение вендора, которое находится на той же машине, с помощью оператора обратной связи Perl.

...
$result = "Result: " . `$vendorsPath/$vendorsExecutable $arg1 $arg2`;
...

Сейчас я просто запускаю веб-браузер IE локально на сервере и получаю доступ "http://localhost/cgi-bin/myPerlScript.pl".. Приложение производителя не работает и регистрирует отладочное сообщение, которое включает в себя следующую трассировку стека (я изменил пару имен, чтобы не выдавать личность продавца):

...
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException (0x80043A1D): 0x80040154 - Class not registered
   --- End of inner exception stack trace ---
   at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)
   at System.RuntimeType.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)
   at VendorsTool.Engine.Core.VendorsEngine.LoadVendorsServices(String fileName, String& projectCommPath)
...

Когда я запускаю приложение vendors из командной строки Windows на сервере с теми же аргументами, которые передает скрипт cgi, он работает просто отлично, поэтому есть что-то в вызове их приложения через веб-скрипт, что вызывает проблему , Эта проблема, скорее всего, связана с безопасностью, потому что все это прекрасно работает на компьютере с Windows XP Pro (как из командной строки, так и из Интернета). Я фактически разработал там свой веб-скрипт и полностью его заработал, прежде чем пытался перенести его на компьютер с Windows Server 2003. Так что же отличает компьютер с Windows Server 2003, который не позволяет приложению .net поставщика успешно выполняться сценарием web cgi?

Могу ли я как-то решить эту проблему, чтобы она работала на моем сервере, или поставщику придется внести изменения в свое приложение .net и отправить новую версию? Я, наверное, единственный человек в мире, который пытается запустить приложение этого поставщика из отдельной программы, поэтому я не хочу беспокоить поставщика этим вопросом, если есть обходной путь, который я могу реализовать здесь на моей серверной машине. Кроме того, я спешу и не хочу ждать от 4 до 6 месяцев, пока поставщик исправит и развернет новую версию.

Спасибо за любой совет, который вы можете дать.

Ответы [ 3 ]

2 голосов
/ 13 мая 2010

Мне кажется, у вас проблема с разрешением. Похоже, что ваше приложение .NET пытается использовать COM-объект, и у него недостаточно прав для этого.

Каждый COM-объект (COM-сервер) имеет разрешение на запуск / активацию и доступ (просто запустите dcomcnfg и посмотрите на конфигурацию DCOM некоторых известных приложений). Что касается dcomcnfg (Службы компонентов), вы можете не только просматривать, но и изменять эти разрешения (выберите приложение и откройте диалоговое окно свойств в контекстном меню. Затем выберите вкладку «Безопасность», выберите «Настроить» в разделе «Разрешение на запуск и активацию»). заблокировать и затем нажать «Редактировать»). Типичная проблема заключается в том, что пользователи INTERACTIVE имеют разрешение на запуск / активацию для большинства объектов COM, но процессы, выполняющиеся как служба, не являются членами этой группы. Таким образом, вы должны настроить разрешение, предоставив некоторой учетной записи (используемой вашим веб-сервером Apache) или группе (например, IIS_IUSRS) такое же разрешение на запуск, которое есть у ИНТЕРАКТИВНЫХ пользователей. Эта информация о разрешениях будет сохранена в подразделе ключа HKEY_CLASSES_ROOT\AppID (см. Двоичное значение реестра AccessPermission).

Чтобы определить COM-объект, который создает проблему, я рекомендую вам Process Monitor (см. http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) и Process Explorer (см. http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx). Process Monitor может помочь вам точно определить, какие другие процессы пытается запустить ваша программа ($vendorsExecutable). Один из последних обращений к HKEY_CLASSES_ROOT используется для запуска COM-объекта. Вы узнаете, какие процесс это. Не забудьте запустить этот инструмент под учетной записью с полными административными правами (на сервере такой проблемы обычно не существует). Чтобы найти нужную информацию, нужно быстрее использовать фильтр для имени процесса и функции поиска процесса. Монитор.

Если вы делаете такую ​​работу в первый раз, она может выглядеть очень сложной. Это непросто, но все имеют четко определенную логику, и я уверен, что вы решаете эту проблему.

1 голос
/ 21 мая 2009

Типичная причина заключается в том, что вы не установили предварительную версию. Трудно сказать, какой, потому что классы COM используются многими приложениями.

Одним из способов обнаружения отсутствующего класса является инструмент sysinternals Process Monitor . Он может быть использован для мониторинга использования реестра. Это поможет вам точно определить, какой класс пытается загрузить скрипт. Именованные COM-классы находятся под

HKEY_LOCAL_MACHINE\SOFTWARE\Classes

и соответствующая запись GUID находится в

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID

Если Apache ищет запись там, но не находит ее, это может быть класс COM, которого нет в perl-скрипте.

0 голосов
/ 13 мая 2010

Скажите, пожалуйста, поможет ли это: При регистрации сервера ATL появляется сообщение об ошибке «0x80040154 (класс не зарегистрирован)»

В зависимости от того, какие инструменты разработчик разработал для своего приложения, это может быть вызвано регистрацией DLL, которая фактически не зарегистрирована в Windows Server 2003.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...