2011年08月11日

「0x800A03EC」が出た…だと…?

【WindowsServer2008R2(64bit)+IIS7+VB2005コンソールアプリ+Excel2003】

とある会社にて、サーバーのリプレースを行ったんですヨ。
 2003→2008R2

で、旧サーバーでは、EXCELをインストールしておいて
夜間バッチでEXCELファイル作成しておくアプリがあったんです。
(もちろん、配布とかしないよ。ライセンスのこともあるしね。作って保存しておくだけ〜)

それも新サーバーに移行したのですが…

ログインしたユーザーでexe実行すれば、ちゃんとエラーもなくEXCELが出力されるけど
バッチ用のユーザー(admin権限持ち)でタスク登録しておいて実行させると

    System.Runtime.InteropServices.COMException
    HRESULT からの例外: 0x800A03EC
    Interop.Excel


↑が、発生して、ファイルができない…orz
 
 
旧サーバーでも動いてるし、
そもそも新サーバーでも
ログインしたユーザー(admin権限持ち)であればフツーに動いてるし!
絶対ソースのせいじゃないんよ!
権限設定間違えた?いや、adminつけてるし!


なーぜーじゃー?!



ってことで「0x800A03EC」でググってたら、一杯掲示板とかhitするんですよ。
でも、大体どのスレでも下記リンクの
「Office のサーバーサイド オートメーションについて」のサイトに誘導されるという…
http://support.microsoft.com/kb/257757/ja/

いや、わかってるってば!

<※2011/08/12追記 以下のグレーになっている方法では解決できません!
もちっと下の方までスクロールしてください>

その後もググってたら
http://oshiete.goo.ne.jp/qa/6208233.html
とか
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200503/05030024.txt
がhit

……ん?DCOMの構成Microsoft Excel アプリケーションのプロパティ

ちょー心当たりがある!!!
記憶を頼りに資料を探し出したら…あったよ設定方法記載したファイル!

結論をいうと「ASPNET」ユーザーのアクセス許可を追加しないとダメな模様。
(ただ、キケンが一杯なので許可入れるときは自己責任でよろしく。当方は責任を負いませんヨ!)
管理ツール>コンポーネント サービス>
コンソール ルート>コンポーネント サービス>コンピュータ>マイ コンピュータ>DCOM の構成


で、2008サーバーで登録をしようと思ったら、また躓いた…
2003サーバーでは「ASPNET」ユーザーって「IIS_WPG」だったのに
2008サーバーには「IIS_WPG」なんていないんですけどぉおおぉ?!


仕方がないのでぐぐる。→英語だけどhit→ここ
>It is now called the IIS_IUSRS.
「IIS_WPG」から「IIS_IUSERS」に変わってたんか!!


……まいくろそふと、そーゆー重要なモノは名前変えるなよorz
 
<2011/08/12追記>
昨日書いた方法ではやっぱり同じエラーでていました…orz

うーん。VB2005アプリでは
「雛型となる.xlsファイルをオープン→色々書込み→名前をつけて保存」しているだけなんですけどねぇ

エラー発生箇所を抜粋すると↓こんなん
(※解放処理は、finallyでMarshal.ReleaseComObject使ってやってるよ)
'エクセルオブジェクト
Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim xlBook As Excel.Workbook = Nothing
Dim xlSheet As Excel.Worksheet = Nothing

'雛型エクセルを基にしてエクセルを開く
xlBook = xlBooks.Add("雛型xlsファイルのフルパス")'←ここで「0x800A03EC」発生
 

なぁにがいけないの…?
一日ずーっと調べていたけど解決策がhitしねぇええええ!!!どーしようー?!


で、今朝出勤したら、先輩から本家MSDN掲示板の翻訳されてたサイト教えてもらったよ!
http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/a26876ed-4c79-49d6-bd7b-348f9d52d36c/

これによると
>概要はとしては、以下のフォルダを作成するだけでOKです。
>・Windows 2008 Server x64 の場合
>  C:\Windows\SysWOW64\config\systemprofile\Desktop
>
>・Windows 2008 Server x86 の場合
>  C:\Windows\System32\config\systemprofile\Desktop
>
>これだけで、私の環境ではOfficeのオートメーションが使えるようになっています。


実際、DCOMの構成を元のデフォルトに戻してから上記フォルダを追加したら
ちゃんと動いたらしいよ…

なーんでー?!ということで上記パスをググって見たら日本語でも一杯hit

こちらのブログ(http://boxonxp.blogspot.com/2010/04/x64-dcom.html)さんの
照会してる本家MSDN掲示板いわく
http://social.msdn.microsoft.com/Forums/en-US/innovateonoffice/thread/b81a3c4e-62db-488b-af06-44421818ef91

どうやら、2003R2サーバーまでは存在していた
SystemProfile が実行する仮想デスクトップフォルダが存在しない」ため
実行ユーザーがログオンしていない状態で実行(タスク実行とか)すると、
デスクトップがないのでEXCEL(つかオフィス?)が実行できないらしい。


なぁるほどねぇ…。納得。
 

って、「やっぱりエラーでた。でもさっきと違うエラーだったよ」だそうなorz
エラー発生箇所は、おなじとこ
System.UnauthorizedAccessException
CLSID {00024500-0000-0000-C000-000000000046} を含むコンポーネントの
COM クラス ファクトリを取得中に、次のエラーが発生しました: 80070005。


 
CLSID {00024500-0000-0000-C000-000000000046}は、
http://support.microsoft.com/kb/240794/ja いわく
>Excel.Application の CLSID
だということで…やっぱり「DCOMの構成」での許可いるんじゃないか…orz

ちと試してくるっす…

 




※2013/07/10の独り言※
相変わらず、このブログで一番の閲覧数を誇る記事になってますね…(汗
皆さん、同じようなことでお困りなんですねぇ…

一応、ココに書いてあるアレコレはマイクロソフトでは推奨してません
ぶっちゃけ、Officeはログオンユーザーの対話式以外で実行されると
知らぬ間に危険なマクロが実行できたり
とか
色々セキュリティ上で問題があるし、
ログオンユーザーが利用していること前提の仕様になってるので
正常稼動するかわからん
のでやめとけと言ってるわけで…

それでも非対話式でエクセル作りたいのなら、
OpenXMLファイルで作っておいてエクセルで開くとか
Excel Servicesての用意してあるからそれ使えとか
代替案を用意してくれてるのですよ

まぁ、時間や予算があればちゃんと直すんですけどねー
とりあえず動かしたい場合は前述の色々な設定をしなきゃいかんという…

そこんところを踏まえた上で、自己責任
セキュリティに穴を開ける設定をして動かしてくださいね?
ほんと、マジで当方は責任を負いませんからねー(滝汗
 


*メモ*
オートメーション機能を利用しないExcel形式でのWeb帳票印刷
 http://codezine.jp/article/detail/194
WEBシステムなら「xml形式だけどEXCELで起動する」ってのも出来るのか…

これ、応用すればWindowsアプリでも出来そうだよね?
例えば、tempフォルダにxmlで一時保存かーらーのー
Process.Start("EXCEL", 一時保存したxmlパス)
とか
これならシステム起動したPCにEXCELがインストールされてればOKだし
一考の余地ありですな…
posted by Tia at 17:13| Comment(0) | その他 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。