4

Interop.domino.dll アセンブリを使用してドミノ/ノートと対話し、ドキュメントを作成、更新、および削除する C# コンソール アプリケーションを作成しました。cmd プロンプトまたは Visual Studio を使用して手動で実行すると、アプリケーションは正常に実行されます。ただし、アプリケーションをスケジュールされたタスク (ドメイン サービス アカウントで実行) としてセットアップしようとすると、次のエラーで失敗します。

  • System.Runtime.InteropServices.COMException: CLSID {29131539-2EED-1069-BF5D-00DD011186B7} を持つコンポーネントの COM クラス ファクトリを取得できませんでした: 80004005 不明なエラー (HRESULT からの例外: 0x80004005 (E_FAIL))。

Interop.domino.dll からオブジェクトを使用しようとすると、特に次のように NotesSession オブジェクトのインスタンスを作成しようとすると、エラーが発生します。

  • ISession notesSession = new NotesSession();

調査の結果、相互運用アセンブリにはデスクトップと対話する必要があり、スケジュールされたタスクがスケジュールされたタスクで実行されていたマシンにログインしているサービス アカウントでスケジュールされたタスクを実行すると、スケジュールされたタスクが正常に実行されることがわかりました。サービス アカウントとしてログインすると、アプリケーションの実行中にアプリケーションが svchost.exe ウィンドウを表示することがわかりました。これが、デスクトップが必要な理由です。

ただし、サービス アカウントを常にマシンにログインさせることは、サーバーが再起動するたびにアカウントを再度ログインする必要があることを意味するため、受け入れられる解決策ではありません。また、サービス アカウントによるマシンへのログインを許可することには、セキュリティ上の懸念もあります。

それで、この問題を回避する方法について何か提案があるかどうか疑問に思っていましたか? アセンブリが表示しようとする UI を抑制する方法はありますか? または、同様の結果を達成するスケジュールされたタスクの代替案を誰でも提案できますか。私たちがしなければならないことは次のとおりです。

  • 設定した間隔でアプリケーションを実行する (IE - 1 日 1 回 / 1 時間に 1 回)
  • 理想的には、(ローカル システム アカウントではなく) ドメイン サービス アカウントで実行します。
  • サービス アカウントをマシンにログインさせずに実行 / Interop.domino.dll の UI 要素を抑制

Interop アセンブリではなく Notes Web サービスを使用する同様のアプリケーションを作成することを検討しましたが、コンソール アプリをスケジュールされたタスクとして実行できない場合は、その道をたどります。しかし、可能であれば、私がすでに書いたものを利用したいと考えています。

更新 01/05/12

@dna-man ソリューションに従って、NOTESNTSERVICE OS 環境変数を設定しようとしました。ただし、これで問題は解決しませんでした。

今のところ、ローカル システム アカウントで実行され、デスクトップとの対話が許可された Windows サービスとしてアプリケーションをセットアップしました。これは、簡単にスケジュールを設定できず、ドメイン サービス アカウントで実行されていないため、理想的ではありませんが、アプリケーションは動作するので、当面はこのアプローチを使用します。

このアプローチを示唆する回答がありましたが、削除されたようで、正しいとは言えません。他の誰かが提案を持っているかどうかを確認するために、質問を少し開いたままにしておくかもしれません。

4

3 に答える 3

1

コードが Domino サーバーで実行されている場合は、OS 環境変数 NOTESNTSERVICE=1 が設定されていることを確認する必要があります。この環境変数の詳細については、Lotus C API のドキュメントを参照してください。ただし、サービスとして実行する場合は COM API にも適用されます。私は 2003 年にサービスとして実行する必要のある VB.NET アプリケーションを作成しましたが、この環境変数を設定することが重要でした。設定されていないと、マシンからログオフするとすぐにサービスが停止します。将来、サービスをインストールするときに誰かがこの環境変数を設定するのを忘れないようにするために、私はサービス マネージャーの開始コードに、SetEnvironmentVariable への VB.NET 呼び出しを使用して、起動時にこの環境変数を直接設定させました。Domino セッション オブジェクトを作成する前に設定する必要がありました。

于 2012-04-25T03:48:57.967 に答える
0

It's hard to say exactly why, but I believe it's failing to read the registry information for the Lotus interop classes. Obviously the entries are there, otherwise it would not work while running manually. So let's consider other possibilities.

I don't even know if this is possible, but os your application running as 32 bit when run manually, but 64 bit when scheduled? IBM doesn't support the Domino COM classes on Win64, and I'm pretty sure that the first symptom of that is that the registry l

A more mundane possibility is that the service account just doesn't have access to read the registry entries for the Notes/Domino install on the machine, possibly because the software was installed under a specific user account.

于 2012-04-20T21:40:59.763 に答える
0

最終的にアプリケーションを少し変更して、ローカル システム アカウントで実行される Windows サービスとして設定し、デスクトップとの対話を許可しました。これは、スケジュールを簡単に立てることができず、ドメイン サービス アカウントで実行されないため、理想的ではありません。ただし、このアプローチでは、常にアカウントにログインする必要なくアプリケーションを実行でき、相互運用 UI 要素を表示できます (したがって、エラーを回避できます)。

設定された間隔 (1 日 1 回に設定) でタスクを実行するように Windows サービスをスケジュールするには、ここで提案されているタイマー ソリューションを使用しました。

于 2012-05-09T22:49:54.583 に答える