none
Vistaのタスクスケジュールに設定したExeからExcelの起動ができない RRS feed

  • 質問

  • Vistaのタスクスケジュールについてご質問させてください。

     

    ローカルフォルダ内のExcelファイルを操作するExeファイルを作成しました。

    定期的な実行を行いたいので、VistaのタスクスケジュールにExeを設定したのですが、

    以下のエラーが発生し正常動作しません。

     

    CLSID {00024500-0000-0000-C000-000000000046} を含むコンポーネントの COM クラス ファクトリを取得中に、次のエラーが発生しました: 80070005。

     

    開発環境はVisual Studio 2005上で、C#を使用しています。

    Excel のバージョンは 2007です。

    Vista はBusiness の SP1です。

     

    私の検証した内容です。

     ・Exeを直接実行した場合は、正常に動作します。

     ・タスクスケジュールで「ユーザーがログオンしているときのみ実行する」では正常動作します。

     ・「ユーザーがログオンしているかどうかにかかわらず実行する」を選択するとエラーになります。

     

     ※「ユーザーがログオンしているかどうかにかかわらず実行する」を選択すると設定完了時に

      パスワードを聞いてきますが、正しいパスワードを設定しています。

     ※関係あるかわかりませんが、設定しているユーザーはマシンのAdministrators権限を持っています。

     ※ちなみに、同じExeをXPのマシン上のタスクに設定すると正常に動作します。

     

    Exe内のExcelの操作内容でエラーが発生しているのではなく、Excelオブジェクト?の作成自体が

    そもそもできていないようです。

    何か回避方法があればご教授ください。

     

     

    以下に検証用のソースを記載します。

     

    Visual Studioの参照の追加から Microsoft.Office.Interop.Excel バージョン 12.0.0.0 を追加してください。

     

    ------

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Excel = Microsoft.Office.Interop.Excel;
    using System.Runtime.InteropServices;

    namespace TEST
    {
        class Program
        {
            static void Main(string[] args)
            {
                Excel.Application xlsExcel = new Excel.Application();
                xlsExcel.DisplayAlerts = false;
                xlsExcel.Visible = false;

                Excel.Workbook xlsWorkBook = null;
                Excel.Worksheet xlsWorkSheet = null;

                string strIndAssocExcelFilePath = "[Excelファイルのパス]";

                try{
                    xlsWorkBook = (Excel.Workbook)(xlsExcel.Workbooks.Open(strIndAssocExcelFilePath,
                        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                        Type.Missing, Type.Missing, Type.Missing, Type.Missing));

                    xlsWorkSheet = xlsWorkBook.Worksheets[1] as Excel.Worksheet;
                    xlsWorkSheet.Cells[1, 1] = DateTime.Now.ToString();
                    xlsWorkBook.Save();

                }catch(Exception ex){

                }finally{
                    if (xlsWorkBook != null)
                    {
                        xlsWorkBook.Close(false, null, null);
                        Marshal.ReleaseComObject(xlsWorkBook);
                    }
                }
            }
        }
    }
    ------

     

     

     

     

     

     

     

     

     

    2009年1月9日 9:32

回答

  • Sample は COM の解放がまともにできていない bug がありますが、とりあえずおいておいて。

     

    一つ目の問題は DCOM (Microsoft Excel Application) の ACL です。

    [起動とアクティブ化のアクセス許可] でその job を起動する user かもしくは "Batch" に対して 「ローカルからの起動」、「ローカルからのアクティブ化」を許可してください。

    これで、Excel.Application objcet を呼び出せるようになります。

     

    ただし、次の問題として Workbooks interface の Open method が下記 error で失敗します。

     

    System.Runtime.InteropServices.COMException (0x800A03EC): ファイル '%1'  にアクセスできません。次のいずれかの理由が考えられます。

    • ファイル名またはパスが存在しません。
    • ファイルが他のプログラムによって使用されています。
    • 保存しようとしているブックと同じ名前のブックが現在開かれています。

     

    これについてはまだ解明できていません。

     

    おもいっきり推測ですが、Workbooks interface の Open method は実行時に ROT (Running Object Table) を check しに行くのかもしれません。その際に Task Scheduler で起動した process は Interactive では無いため、そこで制限に引っ掛かているのではないかと。

     

    なお、server-side での Office application はずっと以前から非推奨となっていたため、使えなくなったとしても何の不思議もないような気がします。

     

    Office のサーバーサイド オートメーションについて

    2009年1月15日 18:01

すべての返信

  • (自己レスです)

    いろいろ確認していますが、まだ原因が分かりません。

     

    これは、Vista のスケジューラー機能のセキュリティ強化による仕様なのか、

    設定が足りないのか、そもそも不具合なのかの切り分けに迫られています。

     

    似たようなご経験をされた方がいらっしゃいましたら、

    アドバイスをいただけますと幸いです。

     

    宜しくお願い致します。

    2009年1月14日 9:47
  • Sample は COM の解放がまともにできていない bug がありますが、とりあえずおいておいて。

     

    一つ目の問題は DCOM (Microsoft Excel Application) の ACL です。

    [起動とアクティブ化のアクセス許可] でその job を起動する user かもしくは "Batch" に対して 「ローカルからの起動」、「ローカルからのアクティブ化」を許可してください。

    これで、Excel.Application objcet を呼び出せるようになります。

     

    ただし、次の問題として Workbooks interface の Open method が下記 error で失敗します。

     

    System.Runtime.InteropServices.COMException (0x800A03EC): ファイル '%1'  にアクセスできません。次のいずれかの理由が考えられます。

    • ファイル名またはパスが存在しません。
    • ファイルが他のプログラムによって使用されています。
    • 保存しようとしているブックと同じ名前のブックが現在開かれています。

     

    これについてはまだ解明できていません。

     

    おもいっきり推測ですが、Workbooks interface の Open method は実行時に ROT (Running Object Table) を check しに行くのかもしれません。その際に Task Scheduler で起動した process は Interactive では無いため、そこで制限に引っ掛かているのではないかと。

     

    なお、server-side での Office application はずっと以前から非推奨となっていたため、使えなくなったとしても何の不思議もないような気がします。

     

    Office のサーバーサイド オートメーションについて

    2009年1月15日 18:01
  • ちゃっぴさん

    ご返信ありがとうございます。

     

    [起動とアクティブ化のアクセス許可] の設定を修正する方法を試してみましたが、

    やはりエラーとなってしまいます。

     

    今回、Vista 上でOffice を起動するバッチをタスクスケジューラから起動したかったのですが、

    そもそも、このような操作は非推奨で動作保証されていないということが認識できました。

     

    調べていけば回避方法があるかも知れませんが、

    別の方法を検討した方が建設的であるような気がします。

     

    一旦、本質問は回答済みとさせていただきます。

     

    もし、回避方法が見つかりましたら同じ問題でお悩みの方のために

    本スレッドを活用していただけますと幸いです。

     

    2009年1月19日 6:04