我编写了一个 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 服务,并允许与桌面交互。这并不理想,因为它不允许我们轻松地安排它并且它不在域服务帐户下运行,但应用程序确实可以工作,所以我们现在将采用这种方法。
有一个答案建议使用这种方法,但它似乎已被删除,因此我无法将其标记为正确。我可能会让这个问题有点开放,看看其他人是否有任何建议。