使用 Interop.domino.dll 的 C# 控制台应用程序 - 作为计划任务运行时失败

标签 c# com lotus-domino interop-domino

我编写了一个 C# 控制台应用程序,它使用 Interop.domino.dll 程序集与 domino/notes 交互以创建、更新和删除文档。通过 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 - 每天一次/每小时一次)
  • 理想情况下,让它在域服务帐户下运行(而不是本地系统帐户)
  • 运行时不需要服务帐户登录到机器/来自 Interop.domino.dll 的 UI 元素被抑制

我们考虑过使用 Notes Web 服务而不是 Interop assmebly 编写一个类似的应用程序,如果我们不能让控制台应用程序作为计划任务运行,我们将沿着这条路走下去。但是,如果可能的话,我们希望使用我已经编写的内容。

更新 01/05/12

我已经尝试按照@dna-man 解决方案设置 NOTESNTSERVICE 操作系统环境变量。但是,这并没有解决问题。

目前我们已将应用程序设置为在本地系统帐户下运行的 Windows 服务,并允许与桌面进行交互。这并不理想,因为它不允许我们轻松地安排它,而且它不是在域服务帐户下运行,但应用程序确实可以工作,所以我们现在将采用这种方法。

有一个答案建议采用这种方法,但它似乎已被删除,因此我无法将其标记为正确。我可能会把这个问题悬而未决,看看是否有人有任何建议。

最佳答案

如果您的代码在 Domino 服务器上运行,您必须确保设置了操作系统环境变量 NOTESNTSERVICE=1。您可以在 Lotus C API 文档中找到有关此环境变量的更多信息,但它在作为服务运行时也适用于 COM API。早在 2003 年,我就创建了一个必须作为服务运行的 VB.NET 应用程序,设置这个环境变量是关键。如果没有设置,一旦我注销机器,该服务就会停止工作。为了确保将来有人在安装服务时不会忘记设置此环境变量,我只是让我的服务管理器启动代码在启动时使用 VB.NET 调用 SetEnvironmentVariable 直接设置此环境变量。它必须在创建 Domino session 对象之前设置。

关于使用 Interop.domino.dll 的 C# 控制台应用程序 - 作为计划任务运行时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10240154/

相关文章:

com - 有关COM .net程序集,重排,dll,tlb和guids的几个简短问题

c++ - ComCtl32.dll 版本 6 与 Qt

java - 使用 Java 从 Lotus Notes 文档获取 .txt 文件

lotus-notes - Lotusscript:作为网络用户发送电子邮件时的发件人地址

c# - 在 Entity Framework 6 中什么时候不需要声明关系?

c# - 在 WebAPI 2 中只允许来自本地机器的请求

c# - 并非所有接口(interface)成员都将被实现

c# - Outlook 2003 - 显示第一次出现的开始/结束日期的重复项

javascript - XPages 进度条在服务器页面持久性设置 "keep pages in memory"下无法按预期工作

c# - 从同一线程内部中止线程