ここで状況に直面しているので、フィードバックやアドバイスをお願いします。特定のサービスアカウント(サーバーの管理者ではない)を使用してサービスとして実行されるアプリケーションが与えられ、Excelブックを開こうとしました。
以下の一般的なC#コード(サービス構造に埋め込まれている)で再現できるため、問題は最初のアプリケーションではありません。
try{
this._exApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
this._exApp.Visible = false;
Log.Logger.Info("Opening workbook...");
Workbook workbook = this._exApp.Workbooks.Open(
thisFileName,
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
);
Log.Logger.Info("Workbook opened!");
//Do something with the result
Log.Logger.Info("Closing workbook...");
workbook.Close(false, thisFileName, null);
Marshal.ReleaseComObject(workbook);
this._exApp.Quit();
}
catch(Exception ex){
Log.Logger.Error(ex.Message);
}
(* this._exApp *とthisFileNameについては、それぞれMicrosoft.Office.Interop.Excel.Applicationにキャストされ、開くファイルのパスを含む文字列として特別なことは何もありません。Log.Loggerは、を使用するロガークラスです。 log4netを使用すると、問題がいつ発生したかを確認できます)
サービスは、管理者ではなくサーバー上のユーザーであるサービスアカウントとして実行されています。ターゲットファイルとサーバー上のファイルにアクセスできます(読み取りアクセスとして)。サーバーはWindowsServer2003 Standard Edition SP2です(2008 R2サーバーではまだ試すことができませんでした)。
私が直面している問題は、ブックを開こうとするとハングするだけなので、最後の行をトレースすると、「ブックを開いています...」であり、「ブックを開いています」の行に到達しません。例外は発生しません。
したがって、コードは非常に単純で、Excelワークブックを開こうとしているだけです。私はすでにいくつかの調査を行いました、そしてここに私の発見があります:
- Microsoftがサーバー側のExcel自動化をサポートしていないことは知っていますが、サービスはそのまま提供されており、使用するテクノロジについて選択することはできません。
- すべてのコンポーネントサービス/DCOM/ MicrosoftExcelアプリケーションのセキュリティ設定を構成して、サービスアカウントが可能なすべてのアクセス許可を持つようにしました。
- サービスアカウントがマシンのローカル管理者である場合、サービスは正しくジョブを実行します。これは実際には本番用のオプションではありません。
- 開こうとするファイルがローカルファイルの場合、サービスは正しくジョブを実行します。残念ながら、アクセスしようとしているファイルはリモートファイルサーバー上にあり、その状況では機能しません。
- 上記のコードは、リモートファイルで同じユーザーを使用してコマンドラインから実行すると正常に機能しますが、サービスとして実行すると機能しなくなります。
- C:\ Windows \ System32 \ config \ systemprofile \ Desktopのバグについて読みましたが、フォルダーは存在します。
- サービスアカウントで起動すると、Excelが正しく開きます。
したがって、基本的には、Workbooks.Openメソッドは、サービスとして実行する場合、管理者ではないサービスアカウントで実行する場合、およびリモートファイルにアクセスする場合にハングします。
このトピックに関するご意見やアイデアをいただければ幸いです。
ありがとう。
ジョナサン
編集:以下のMattの回避策に従って、リモートファイルのローカルコピーを実装したので、それを回答として受け入れていますが、リモートファイルで直接機能させる方法についての提案には引き続き関心があります。