4

我编写了一个 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 组件编写一个类似的应用程序,如果我们不能让控制台应用程序作为计划任务运行,我们将沿着这条路走下去。但是,如果可能的话,我们想利用我已经写过的东西。

2012 年 1 月 5 日更新

我已经尝试按照@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

很难确切地说出原因,但我相信它无法读取 Lotus 互操作类的注册表信息。显然条目在那里,否则在手动运行时它将不起作用。所以让我们考虑其他可能性。

我什至不知道这是否可能,但是您的应用程序在手动运行时以 32 位运行,但在计划时以 64 位运行?IBM 不支持 Win64 上的 Domino COM 类,我很确定第一个症状是注册表 l

更常见的可能性是服务帐户无权读取机器上安装的 Notes/Domino 的注册表项,这可能是因为该软件是安装在特定用户帐户下的。

于 2012-04-20T21:40:59.763 回答
0

我最终稍微修改了应用程序,将其设置为在本地系统帐户下运行的 Windows 服务,并允许与桌面交互。这并不理想,因为它不允许我们轻松地安排它,而且它不是在域服务帐户下运行的。但是,这种方法确实允许应用程序在不需要帐户始终登录的情况下运行,并且确实允许显示互操作 UI 元素(从而避免错误)。

为了安排 Windows 服务以设定的时间间隔(我每天设置一次)执行任务,我使用了此处提出的 Timer 解决方案。

于 2012-05-09T22:49:54.583 回答