はじめに
クライアント側のWeb画面操作をトリガーにして、IISのサーバー側で既存のExcelマクロ(秘伝のタレ的な業務ツール)を実行させたいという無茶な要求があり、試行錯誤したときのメモです。
同じサーバー内にて、タスクスケジューラ等を使用してExcelマクロをバッチ実行させている環境でもあります。
注意
MS Officeのサーバーサイド オートメーションはMicrosoftでは非推奨かつ動作保証されません。
また、ライセンスの問題も存在します。以下のリンク先を確認して自己責任でお願いします。
Office のサーバーサイド オートメーションについて
環境
- Windows Server 2016
- Microsoft Excel 2016
- IIS 10
WebアプリはASP Classic(VBScript)で作成。
そんな化石みたいな技術を使うなという意見もあると思いますが、Visual Studioのライセンスが与えてもらえない状況下でしたのでこれが精一杯でした。
(拡張子.asp、文字コードUTF-8)
IISの設定
専用のアプリケーションプールを作成
IISマネージャーのアプリケーションプールの設定画面で以下画像のように設定する。
詳細設定 >
- .Net CLRバージョン v4.0
- 32ビット アプリケーションの有効化 True(後述のExcelの環境に依存する)
- プロセスモデル > ID > カスタムアカウント
カスタムアカウントはWebアプリを実行したいユーザー
参考文献
IIS ASP.NET でエクセルを使用する方法
https://itblogdsi.blog.fc2.com/blog-entry-418.html
DCOM設定関係
Excelの32bit/64bit判別
Excelのバージョン情報から32bit版か64bit版かを確認しておく
DCOM設定
コマンドプロンプトで mmc.exe comexp.msc /32
⇒後ろに/32をつけることで32bitアプリケーション用のコンポーネントサービスを呼び出せる。
(通常Excelは32bit版がインストールされているはずなので。ここは各自で確認してね)
DCOMの構成 > Microsoft Excel Application で右クリック > プロパティ
ID タブを選択 > 起動したユーザー
参考文献
http://cu-kansai-it.org/?p=453
64bit Windows 環境で 32bit の DCOM コンポーネントを登録しても一覧に表示されない
https://www.projectgroup.info/tips/Windows/comm_0060.html
Excel.applicationのローカルパスが空白になる
https://social.msdn.microsoft.com/Forums/ja-JP/9e71d56d-01f6-4949-b7de-ed235dff6362/excelapplication123981252512540124591252312497124731236431354303331?forum=aspnetja
Windows認証でDCOM起動可能にする設定
DCOMの設定「セキュリティ」タブと、IISマネージャーの認証の設定を以下の画像のように設定する。
※IISの認証の設定で、Windows認証以外の認証方法は無効にしておくこと
ユーザー「NETWORK」にローカルからの権限を付与してあげるのがポイント。
他のサイトでよく解説されている"IIS_IUSRS"に権限を与えてもWindows認証で接続してきたユーザー情報が取得できない。
⇒これが取得できないとWebアプリ内のユーザー認証機能が作れないので苦労する
メモ
・DCOM設定を特定のユーザ(このユーザー)に設定した場合の副作用
サーバーにログインして直接VBScriptからExcelマクロを叩く時(タスクスケジューラから起動する等)、最上位の特権でないとCreateObject("Excel.Application")で失敗する。