2011-07-13 10 views
5

COMコンポーネントでrather strange issueに直面しました。このコンポーネントは、よく知られたインターフェイスを実装し、サードパーティのクローズドソース製品(以下、製品Xという)によって消費されます。製品XはWindowsレジストリで構成されています。製品Xはレジストリを読み取り、コンポーネントのクラスIDを検出します。COMオブジェクトはあるプログラムからインスタンス化されますが、同じユーザーで実行されている別のインスタンスからインスタンス化されません

私たちのコンポーネントは、ネイティブC++でATLを使用してインプリメントされた32ビットのもので、64ビットシステムでCOM +で登録して、サロゲートプロセスでアクティブにします。

今、製品Xは、私たちのコンポーネントを使用するために失敗し、WindowsのイベントログにE_ACCESSDENIEDをトレースし、我々はまた、アプリケーション固有の権限設定は、COMサーバーアプリケーションのローカルアクティブ化アクセス許可を付与するものではありません

次のエラーメッセージを参照しますローカルLocalHost(LRPCの使用)からCLSID {ここでCOMオブジェクトのクラスID}とAPPID {ここではCOM +アプリケーションのアプリケーションID}をユーザーのMACHINENAME \ administrator SID(ここではSID)に割り当てます。このセキュリティアクセス許可は、コンポーネントサービス管理ツールを使用して変更できます。

システムログです。

これはアクセス許可の問題のようです。だから我々はnewのCOMコンポーネントことをC#での「Hello、World」プログラムを細工し、それから1些細な(失敗することはありません)メソッドを呼び出します:

OurComponent.IOurComponent部品=新しいOurComponent.OurcomponentClassを(); component.TrivialMethod();

このプログラムを製品Xと同じアカウントから実行すると、コンポーネントがインスタンス化され、COM +コンソールで「緑色のボールがプラス」になっていることがわかります。

同じユーザーアカウントで同じマシン上で2つのプログラムを実行し、COMコンポーネントをインスタンス化して別のコンポーネントをインスタンス化することはできません。その理由は何でしょうか?

+0

私はsooo好奇心だなぜこれがdownvoteを得た。 – sharptooth

+0

ああ、COMアクセス拒否を決して終わらない人。私はあなたのために感じます...私は本当の提案はありませんが、私は疑問に思っています:1)Xはインスタンスを作成している方法を知っていますか? COAUTHINFOには奇妙なことがあるかもしれません。 2)Xが管理者として実行されている場合は変更されますか? 3)あなたのHello WorldはXと同じビット数ですか? (問題ではないが、誰が知っているか)。 – eran

+0

@eran:Xがインスタンスをどのように作成するかはわかりません。 XとHelloの両方の世界は管理者として実行され、両方とも同じビット数を持ちます。 – sharptooth

答えて

0

あなたはアプリの設定が不足していると思います。

これは2つのことです。 1あなたのアプリは "Com Visible"としてコンパイルする必要があります。 2 comコンポーネントを登録する必要があります(まだ登録されていない場合)

[スタート] - > [管理ツール] - > [コンポーネントサービス]に移動します。コンポーネントサービス、コンピュータ、マイコンピュータ、DCOM構成を展開します。スクロールしてアプリケーションを見つけます。右クリック→「プロパティ」を選択し、「セキュリティ」タブを選択します。最初のブロック起動とアクティベーションの権限 - [カスタマイズ]ラジオボタンが選択されていることを確認し、[編集]をクリックします。今、使用しているアカウントに起動、有効化、リモート起動/有効化の権限を与えます。マシンを再起動する(またはサービス/アプリケーションを再起動する)とうまくいけばうまくいきます。

関連する問題