4

COM インターフェイスを公開する Windows サービス (Visual Studio ATL ウィザードに基づく exe) を作成しました。インプロセス サーバーまたは Windows サービスとして実行しても問題ありません。IIS アクセスの外部でいくつかのプロセスを使用できるようにする必要があるため、Windows サービスが必要です。

私は自分のサービスを呼び出す Web ページ (aspx/C#) をいくつか作成しており、Visual Studio .NET 開発サーバー内ですべてが正常にテストされています。現在、さらにテストするために、Web ページを IIS 7 (Windows 7 で実行) にプッシュしようとしています。しかし、ページが IIS で実行されている場合、COM インターフェイスへの呼び出しはすべてエラーで失敗します。

「次のエラーのため、コンポーネントの COM クラス ファクトリの取得に失敗しました: 80070005 アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))。」

サービスが次のとおりであることを確認しました。

  • HKCR\Clsid\ の下で Windows に登録しました (regsvr32.exe は dll でのみ動作するため、実行中の「myservice.exe /RegServer」を登録しました)。
  • myservice.exe には、IIS_IUSRS ユーザーの読み取りおよび実行権限があります。
  • 64 ビット exe です (したがって、デフォルトの IIS アプリケーション プール スペースにロードする必要があります)。
  • .NET Development Server デバッガーでうまく機能します (ただし、IIS では機能しません)。

これがうまくいかない理由はありますか?exe と dll に含まれる COM インターフェイスと何か関係がありますか?

IIS が Windows サービスで公開されている COM インターフェイスを呼び出す可能性はありますか?

4

3 に答える 3

2

DCOM Config の下で、COM オブジェクトを使用するには、サイトのアプリ プール プロセスへのアクセスを許可する必要があると思います。

  • コンポーネント サービスに移動します。
  • > コンピューター > マイ コンピューター > DCOM 構成ブランチ
  • リストでサービスの AppID または名前を見つけます。それを右クリックしてプロパティを選択します。
  • セキュリティタブを開く
  • Launch and Activation Permissions を選択し、Customize を選択します。
  • アプリ プール プロセス (おそらく ASPNET ですが、サイトの IIS アプリ プール プロパティを確認してください) に次の許可を与えます: Local Launch と Local Activation。

これで問題が解決するかどうかお知らせください。

ちなみに:

> is a 64bit exe (so should load in the default IIS app-pool space)

それは完全に真実ではありません。アプリケーション プールは、ISS によって制御されるプロセスです。サービスは、何があっても独自の個別のプロセスで実行されます。したがって、サービスは IIS アプリケーション プールとは何の関係もありません。

于 2013-03-22T12:04:16.557 に答える
1

セキュリティ/アクセス許可の問題に非常によく似ています-そのため、最初にIISワーカーが実行されているユーザーに十分な権限があることを確認し、特にASPNETグループにCOMを使用するアクセス許可があることを確認してください(デフォルトではないと思います) .

編集- それを投稿した後、役立つかもしれない別の投稿を見つけました -ここも見てください

于 2013-03-22T07:46:14.443 に答える
1

みんなありがとう。私は本当にあなたの応答に感謝します。あなたの情報は私を正しい方向に向けました。問題は確かにセキュリティ\アクセス許可の問題でした。問題を悪化させるために、サービスを再構築するたびに、IIS_IUSRS に設定した権限が exe から消去されたため、service.exe の単純な権限が原因でエラーが発生していました。そのため、開発中に COM オブジェクトにアクセスする際に断続的なエラーが発生する場合は、再ビルド後に exe の権限を確認してください。それが他の人に役立つことを願っています。

完了するために、問題を解決した方法は次のとおりです。

  • サービスアプリケーションプールの「ID」を「LocalSystem」に変更しました(私のCOMはシステムアカウントで実行されているWindowsサービスにあったため、ほとんどの人はこのレベルを必要としません)(IISマネージャー|アプリケーションプール|アプリを右クリックしますプール | 詳細設定 | ID
于 2013-03-22T17:09:41.627 に答える