12

レポートを生成する Windows サービスを開発しています。このレポートにはテンプレートがあります。このテンプレートは、Excel ファイルで作成されます。このファイルは、出力フォルダーにコピーされます。

開発中にコンソール アプリケーションのようにサービスを起動しましたが、このファイルに問題なくアクセスできました。

次に、サービスインストーラーを用意しました。サービスはLocal Systemアカウントの下にインストールされます。したがって、この Excel テンプレート ファイルはコンテンツとしてマークされ、実行可能ファイルと共にインストール ディレクトリにコピーされます。

しかし、サービスが開始されると、Excel はこのファイルにアクセスできないように見えます。サービスは にインストールされc:\Program Files (x86)\Our Company\Service Name\ます。ターゲット OS は Windows Server 2008 です。テスト中に Windows 7 を使用し、同じ問題に遭遇しました。

次のコードを使用して、Excel にアクセスします。

using Excel = Microsoft.Office.Interop.Excel;    
//...
Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
//the following line throws an exception
Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(@"path"); 

また、Excelテンプレートファイルを一時ディレクトリ(サービスに書き込み権限がある場所-これはテスト済み)にコピーしようとし、そこから開こうとしましたが、成功しませんでした(このバリアントはコンソールアプリケーションでうまく機能します良い)。

エラーメッセージは次のとおりです。

Microsoft Office Excel はファイル /path/ にアクセスできません。いくつかの理由が考えられます。

1. The file name or path does not exist.
2. The file is being used by another program.
3. The workbook you are trying to save has the same name as a currently open workbook.

Windows サービスがこの Excel テンプレート ファイルにアクセスできるようにするにはどうすればよいですか? それとも別の代替手段がありますか?

4

3 に答える 3

14

ローカル システム アカウントを使用してユーザー サービスで Office アプリケーション (Excel など) を安全に実行するには、次の 2 つの重要なことを知っておく必要があります。 \desktop
C:\Windows\SysWow64\config\systemprofile\desktop (x64 バージョンのみ) このフォルダーがないと、ローカル システム アカウントから Office アプリケーションを正しく実行できません

2) サービスがデスクトップの対話なしで構成されている場合、最初に起動した Office アプリケーション (Excel など) で、ユーザー資格情報ダイアログでフリーズします - このモードではこのウィンドウは表示されません - これを解決するには、デスクトップの対話を有効にし、後で Office ウィンドウに切り替えますサービスを実行し、資格情報を手動で入力します。

そこに他の情報があります(読むにはGoogle翻訳を使用してください)。

于 2013-04-26T12:48:05.120 に答える
9

Office のサーバー側の自動化に関する考慮事項というタイトルの詳細な MS ナレッジ ベース記事があります。いくつかの重要な抜粋:

  • ユーザー ID : Office アプリケーションは、オートメーションがアプリケーションを開始する場合でも、アプリケーションの実行時にユーザー ID を想定します。アプリケーションは、アプリケーションを起動したユーザーのユーザー レジストリ ハイブの設定に基づいて、ツールバー、メニュー、オプション、プリンター、および一部のアドインを初期化しようとします。多くのサービスは、ユーザー プロファイルを持たないアカウント (SYSTEM アカウントや IWAM_[servername] アカウントなど) で実行されます。したがって、Office は起動時に正しく初期化されない場合があります。この場合、Office は CreateObject 関数または CoCreateInstance 関数でエラーを返します。Officeアプリケーションは起動できても、ユーザープロファイルが存在しないと他の機能が正常に動作しない場合があります。

  • デスクトップとの対話性: Office アプリケーションは、対話型デスクトップで実行されていることを前提としています。状況によっては、特定の自動化機能が正しく機能するために、アプリケーションを可視化する必要がある場合があります。予期しないエラーが発生した場合、または機能を完了するために未指定のパラメーターが必要な場合、Office は、ユーザーが何をしたいのかを尋ねるモーダル ダイアログ ボックスをユーザーに表示するように設計されています。非対話型デスクトップのモーダル ダイアログ ボックスを閉じることができません。したがって、そのスレッドは無期限に応答を停止 (ハング) します。特定のコーディング方法はこの問題の可能性を減らすのに役立ちますが、これらの方法で問題を完全に防ぐことはできません。この事実だけでも、サーバー側の環境から Office アプリケーションを実行することは危険であり、サポートされていません。

明らかに、コメントで指摘されているように、SYSTEMアカウントの使用は間違いです。ユーザー プロファイルを持つアカウントでサービスを実行する必要があります。

しかし、それを修正したとしても、他の箇条書きがあなたを殺します. 実際、Office アプリケーションは、インタラクティブなデスクトップで実行されていることを前提としています。私のアドバイスは、Office をサービスから自動化する試みをやめることです。代わりに Aspose のようなライブラリを使用してください。または、対話型デスクトップでプロセスを実行します。

于 2012-12-26T14:07:54.350 に答える