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コンポーネントをインスタンス化して別のコンポーネントをインスタンス化することはできません。その理由は何でしょうか?
私はsooo好奇心だなぜこれがdownvoteを得た。 – sharptooth
ああ、COMアクセス拒否を決して終わらない人。私はあなたのために感じます...私は本当の提案はありませんが、私は疑問に思っています:1)Xはインスタンスを作成している方法を知っていますか? COAUTHINFOには奇妙なことがあるかもしれません。 2)Xが管理者として実行されている場合は変更されますか? 3)あなたのHello WorldはXと同じビット数ですか? (問題ではないが、誰が知っているか)。 – eran
@eran:Xがインスタンスをどのように作成するかはわかりません。 XとHelloの両方の世界は管理者として実行され、両方とも同じビット数を持ちます。 – sharptooth