0

免責事項: 私は .net と COM についてまったく無知です。

.net で記述されているように見えるベンダーのアプリケーションがあり、それを Web フォーム (cgi-bin Perl スクリプト) でラップして、最終的に別のコンピューターからこのベンダーのアプリを起動できるようにしようとしています。私は Windows Server 2003 R2 SE SP1 システムを使用しており、Web サーバーに Apache 2.2 を使用し、cgi スクリプトに ActivePerl 5.10.0.1004 を使用しています。私の cgi スクリプトは、Perl バックティック演算子を使用して、同じマシン上にあるベンダーのアプリを呼び出します。

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

現在、サーバー マシン上でローカルに IE Web ブラウザを実行し、「http://localhost/cgi-bin/myPerlScript.pl」にアクセスしています。ベンダーのアプリが失敗し、次のスタック トレースを含むデバッグ メッセージがログに記録されます (ベンダーの ID を漏らさないようにいくつかの名前を変更しました)。

...
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 マシンに移動する前に完全に機能するようにしました。では、ベンダーの .net アプリが Web CGI スクリプトによって正常に実行されないようにする Windows Server 2003 マシンの違いは何でしょうか?

この問題を何らかの方法で修正してサーバーで動作させることはできますか? それとも、ベンダーが .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は、プログラム ( ) が開始しようとしている他のプロセスを正確に見つけるのに役立ちます。最後のアクセスから 1 つHKEY_CLASSES_ROOTCOM オブジェクトを開始するために使用されます。それがどのプロセスであるかがわかります。完全な管理者権限を持つアカウントでこのツールを起動することを忘れないでください (通常、サーバーではこのような問題は存在しません)。必要な情報をより迅速に見つけるには、プロセス名に対するフィルターと Process Monitor の検索機能を使用します。

このような作業を初めて行うと、非常に複雑に見える場合があります。簡単ではありませんが、すべてに明確なロジックがあり、この問題を解決できると確信しています。

于 2010-05-13T19:19:57.027 に答える
1

一般的な原因は、前提条件をインストールしていないことです。COM クラスは非常に多くのアプリケーションで使用されているため、どれがどれかを言うのは困難です。

欠落しているクラスを見つける 1 つの方法は、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 (クラスが登録されていません)" というエラー メッセージが表示される

ベンダーがアプリケーションを開発したツールによっては、実際には Windows Server 2003 に登録されていない DLL 登録が原因である可能性があります。

于 2010-05-13T19:43:19.157 に答える