0

免责声明:我对 .net 和 COM 完全一无所知。

我有一个供应商的应用程序,它似乎是用 .net 编写的,我正在尝试用一个 web 表单(一个 cgi-bin Perl 脚本)来包装它,这样我最终可以从另一台计算机上启动这个供应商的应用程序。我在 Windows Server 2003 R2 SE SP1 系统上,我将 Apache 2.2 用于 Web 服务器,将 ActivePerl 5.10.0.1004 用于 cgi 脚本。我的 cgi 脚本使用 Perl 反引号运算符调用驻留在同一台机器上的供应商应用程序。

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

现在我只是在服务器机器上本地运行 IE Web 浏览器并访问“ 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)
...

当我从服务器机器上的 Windows 命令行使用与 cgi 脚本传递的完全相同的参数运行供应商应用程序时,它运行得很好,因此通过 Web 脚本调用他们的应用程序会导致问题。这个问题可能与安全有关,因为整个事情在 Windows XP Pro 机器上运行得很好(命令行和 Web 调用)。实际上,我在那里开发了我的 Web 脚本,并在我尝试将它移到 Windows Server 2003 机器之前让它在那里完全工作。那么,Windows Server 2003 机器有什么不同,它会阻止供应商的 .n​​et 应用程序被 web cgi 脚本成功执行?

我能否以某种方式解决此问题以使其在我的服务器上运行,或者供应商是否必须对其 .net 应用程序进行更改并发布新版本?我可能是世界上唯一一个试图从一个单独的程序执行这个供应商的应用程序的人,所以如果有一个我可以在我的服务器机器上实现自己的解决方法,我不想用这个问题来打扰供应商。另外,我有点着急,我不想等待 4 或 6 个月让供应商进行修复并部署新版本。

感谢您提供的任何建议。

4

3 回答 3

2

在我看来,您有权限问题。看起来您的 .NET 应用程序尝试使用 COM 对象,但它没有足够的权限来执行此操作。

每个 COM 对象(COM 服务器)都有启动/激活和访问权限(只需启动dcomcnfg并查看一些知名应用程序的 DCOM 配置)。关于dcomcnfg(组件服务),您不仅可以查看而且可以更改此权限(选择应用程序并在上下文菜单中打开属性对话框。然后选择“安全”选项卡,在“启动和激活权限”块中选择自定义,然后点击“编辑”)。典型的问题是 INTERACTIVE 用户对大多数 COM 对象具有启动/激活权限,但作为服务运行的进程不是该组的成员。因此,您必须通过授予某个帐户(由您的 Apache Web 服务器使用)或组(如IIS_IUSRS) 具有 INTERACTIVE 用户的相同启动权限。此权限信息将保存在密钥的子项中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 对象。你会发现它是哪个进程。不要忘记在具有完全管理权限的帐户下启动此工具(在服务器上通常不存在此类问题)。要更快地找到您需要的信息,请使用进程监视器的进程名称过滤器和搜索功能。

如果你第一次做这样的工作,它看起来很复杂。这并不容易,但一切都有明确定义的逻辑,我敢肯定,你解决了这个问题。

于 2010-05-13T19:19:57.027 回答
1

典型的原因是您没有安装先决条件。很难说是哪个,因为 COM 类被很多应用程序使用。

找出缺失类的一种方法是 sysinternals 工具进程监视器。它可用于监控注册表的使用情况。这有助于您准确跟踪脚本试图加载的类。命名的 COM 类位于

HKEY_LOCAL_MACHINE\SOFTWARE\Classes

并且它们的基础 GUID 条目位于

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID

如果 Apache 正在那里寻找一个条目但没有找到它,那可能是 perl 脚本缺少的 COM 类。

于 2009-05-20T22:08:13.367 回答
0

请告诉我这是否有帮助:您在注册 ATL 服务器时收到“0x80040154(未注册类)”错误消息

取决于供应商开发了他的应用程序的工具,它可能是由于 DLL 注册引起的,实际上没有在您的 Windows Server 2003 上注册。

于 2010-05-13T19:43:19.157 回答