fc2ブログ

記事一覧

IIS で Excel を実行する方法 -COM参照と対話ユーザー- | asp.net


今回は asp.net で Excel などの COM 参照のプログラムを実行する方法について覚え書きします。ローカルの IIS Express で実行すると Excel 参照のプログラムも通常通り動作しますが、Webサイトを発行後に IIS (Expressでない) で動作を確認すると、正常に動作しないことがわかり、DCOMへのアクセス権限等の設定が必要であることが分かりました。ただし、基本的に Microsoft では サーバーサイドの対話サービスや COM 参照をサポートしていませんので、 実装には注意が必要ですので、代替方法として Open XML や Closed XML の実装も検討しましょう。


前提条件
・Windows Server 2012 以降
・Visual Studio 2013 Community 以降
・VB.NET
・.Net Framework 4.0 以降



1.IISの設定

インターネットインフォメーションサービス (IIS) マネージャを開き、Webサイトを起動するワーカープロセスを選択します。ワーカープロセスの詳細設定から、以下の様に設定します。

IIS_DCOM_Excel_02.png


プロセスモデルの ID に設定するユーザーを選択します。 最近の IIS ではデフォルト ApplicationPoolIdentity でユーザー設定されています。ここで設定するユーザーが後述のDCOMでのユーザー設定で重要になってきます。今回の例では従来通りの Network Service で設定します。

次に Web サイトを実行するサーバーの Excel アプリケーションが 32Bit であれば IIS も32ビットアプリケーションの有効化を True に設定します。64Bit であれば False に設定します。Excel が64Bitに対応しているかどうかは、Excel の ヘルプ→バージョン情報から確認するか、Cドライブ直下の Program Files / Program Files (x86) のどちらにインストールされているかで判断が可能です。

※検証してみました結果、ID が LocalSystem の場合は32ビットアプリケーションの有効化が True でないと動作しませんでした。Network Service の場合は 64Bit の IIS でも実行できました。



2.DCOMの設定

Excel などの COM 参照が必要なプログラムをサービスから実行するにはコンポーネントサービスにで DCOM のアクセス権限を設定する必要があります。

コンパネ > 管理ツール > コンポーネントサービス > コンピュータ > マイコンピュータ > マイコンピュータ > DCOMの設定 
から 「Microsoft Excel Application」を選択します。
※表示されない場合は、Excel が 32Bit である場合ありますので、コマンドプロンプトから以下のコマンドを実行してコンポーネントサービスを実行します。

64Bit のOSにて 32Bit のコンポーネントサービスを実行するコマンド
mmc.exe comexp.msc /32


セキュリティタブから全ての権限についてカスタマイズで編集を行い、ローカルの起動・アクティブ化・アクセスを許可します。

IIS_DCOM_Excel_04.png


「アクセス許可」や「起動とアクティブ化のアクセス許可」に関してはアプリケーション毎ではなく、全体の設定をすることも可能です。

IIS_DCOM_Excel_01.png


続いて、Microsoft Excel Application のプロパティから ID タブを開きます。対話ユーザーにチェックを付けて設定を完了します。

IIS_DCOM_Excel_03.png



3.対話ユーザーのフォルダ作成

対話ユーザー用の物理フォルダを作成します。

32Bit アプリケーションの場合は
C:\Windows\System32\config\systemprofile\Desktop

64Bit アプリケーションの場合は
C:\Windows\SysWOW64\config\systemprofile\Desktop

を作成します。
さらにフォルダのアクセス権限として、手順1で設定したユーザー(ここでは Network Service) のアクセス権限をフルコントロールで systemprofile フォルダに設定します。



4.エラーについて

タスクマネージャや VS からのデバッグ実行時には発生しないエラーが発生することがあります。

(1)DCOMの設定が正しくされていない場合、以下のようなエラーが表示されます。
Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046}
failed due to the following error: 80070005 Access is denied.
(Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))



(2)systemprofile フォルダにアクセス権限がない場合、以下のようなエラーが発生します。
ファイル にアクセスできません。次のいずれかの理由が考えられます
• ファイル名またはパスが存在しません。
• ファイルが他のプログラムによって使用されています。
• 保存しようとしているブックと同じ名前のブックが現在開かれています。



(3)Excelを開いたりブックを閉じたり、Rangeのプロパティを設定したりすると以下のようなエラーが発生します。これに関しては動作が保証されていない関係上、原因が分かっておりません。
Exception from HRESULT: 0x800A03EC



以上で IIS 上のプロセスから Excel のCOM参照を含むプロセスを起動することができます。エラーの内容の(3)にありますエラーについては原因が分かっておらず、実際にアプリケーションとして実装する場合にはコーディング等に注意が必要です。






最後までお読みいただきありがとうございます。
いかがでしたでしょうか。他にも asp.net に関連する記事を投稿しておりますのでよろしければご参考くださいませ。



関連記事

コメント

opensshでも使えました
openssh接続でpowershellからexcelを呼び出すと
Methodinvocationexception: Exception calling "Open" with "1" argument(s): "0x800A03EC"
エラーでファイルを開けず途方に暮れていましたがこちらの手順を実施したところ問題なく実行できるようになりました。
ありがとうございます。
コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。