8

C# で記述された .net コンソール アプリケーションがあります。これは、Visual Studio 内で実行するとき、およびファイル システムで .exe ファイルをクリックするときに、正確に行う必要があります。それは魅力のように実行されます。しかし、Windows 7 開発マシンまたは Windows 2008 R2 製品マシンでスケジュールされた Windows タスクを作成すると、アプリケーションの最後のステップを実行できません。この手順では、バックグラウンドで .doc を開き、それを (名前を付けて保存を実行するだけで) .docx に変換します。

このアプリケーションは、ネットワーク パスにアクセスし、問題のない ~Converted という名前のディレクトリを作成するように設計されています。次に、バックグラウンドで開くことがわかった .doc ごとに名前を付けて保存し、do の .docx バージョンを ~ に保存します。変換されたディレクトリ。スケジュールされたタスク以外では問題なくビルドおよび実行されるため、コードに問題はないと思います。タスク内のすべての設定を調査し、変更を加えて再テストしましたが、成功しませんでした。管理者グループの一部であるユーザーで実行していますが、IMO 権限は問題ではありません。NETWORK SERVICE アカウントで試してみましたが、同じ結果でした。

スケジュールされたタスクを実行したときにのみ生成される実際のスタック トレース エラーは次のとおりです。

System.UnauthorizedAccessException: CLSID {000209FF-0000-0000-C000-000000000046} を持つコンポーネントの COM クラス ファクトリを取得できませんでした。次のエラーが原因でした: 80070005 アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))。

これを行っているコード行は次のとおりです。

Application oWord = new Application();

これについて何時間も検索しましたが、何も役に立ちませんでした。タスクを介してコードを実行すると、コードが doc という単語を開いたり初期化したりするときに、COM アクセスの問題が発生しているようです。タスクは、ユーザーがログオンしているかどうかに関係なく、最高の特権で実行され、完全な管理者特権で楽しいものです。私が言ったように、これらの設定はすべて試してみましたが、違いはありませんでした.

この問題を解決できない場合は、このコンソール アプリケーションをサービスとして書き直さなければならない段階になりました。うまくいけば、誰かが丸一日余分な作業を節約し、問題を解決してくれるでしょうか??

追加 - 以下の @Dmitry Martovoi の投稿に基づいて、全員のユーザーにティックを追加し、スタック トレースを次のように変更しました。

System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

これは、同じ saveAs 関数内の次の行を指しています。

oDoc.Close(false, Type.Missing, Type.Missing);

追加 - このパスを所有しているユーザーを変更しているため、どのユーザーがこのパスを実行しているかわかりません。これはアプリケーション イベント ログのエラーです。注 - これは、タスク スケジューラ経由でアプリケーションを実行している場合にのみ発生します。

Faulting application name: WINWORD.EXE, version: 14.0.6129.5000, time stamp: 0x5082f340
Faulting module name: btmofficea.dll, version: 3.0.2.280, time stamp: 0x4cc57919
Exception code: 0xc0000005
Fault offset: 0x0000000000005e1f
Faulting process id: 0x2a6c
Faulting application start time: 0x01ce8bec64ccf85d
Faulting application path: C:\Program Files\Microsoft Office\Office14\WINWORD.EXE
Faulting module path: C:\Program Files\Motorola\Bluetooth\btmofficea.dll
Report Id: a393403d-f7df-11e2-b68c-74de2b9ca154

OK問題は修正されました。@dmay が貼り付けられたリンクに見られるように、MS はサーバー側でオフィス アプリケーションを無人で実行することを推奨しておらず、これはサポートされていないと述べています。しかし、解決策は@Dmitryが向かっていた道を下っていました:

1) スタート -> ファイル名を指定して実行 -> dcomcnfg

2) コンポーネント サービス -> コンピューター -> マイ コンピューター

3) [マイ コンピュータ] を右クリックし、[プロパティ] をクリックします。

4) [COM セキュリティ] タブ、[起動とアクティブ化のアクセス許可]、[デフォルトの編集]

5) スケジュールされたタスクを実行するために使用している NETWORK SERVICE (明らかに使用するのに最適なアカウントです) のすべてのアクセス権を追加します。

6) [マイ コンピュータ] > [DCOM 構成] > [Microsoft Word 97 - 2003 ドキュメント] > [プロパティ] を右クリックします。

7) ID タブに移動し、対話型ユーザーにチェックマークを付けます

8) [セキュリティ] タブに移動し、3 つのセクションすべてのカスタマイズ設定を確認します。NETWORK SERVICE が表示され、オプションがチェックされていることを確認します。これは、ステップ 5 の結果である必要があります。

9) 他のオフィス ドキュメント タイプについては、手順 6 から繰り返します。私はxlsとmdbのためにそうしました

10) 再起動....現在、すべて正常に動作しています

すみません、これを追加する必要がありました。手順 7 でこれらが表示されない場合:

               'Microsoft Word 97 - 2003 Document'

               'Microsoft Excel Application'

               'Microsoft Access Application

次に、おそらく64ビットマシン上の32ビットオフィスインストールです。これらを表示するためのソリューションは次のとおりです。

皆様、お時間をありがとうございました

4

3 に答える 3

8

同様の問題に直面して、アプリケーションが通常は期待どおりに動作しているのに、スケジュールされたタスクから実行するとすぐに終了し、「ファイル パスが見つかりません ...」というエラーがスローされます。

スケジュールされたタスク アクション パラメータを設定して修正しました。

開始 (オプション): c:\my application\executable folder path

于 2015-07-23T10:29:43.877 に答える