加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

使用Interop.domino.dll的C#控制台应用程序 – 在作为计划任务运

发布时间:2020-12-14 05:41:02 所属栏目:Windows 来源:网络整理
导读:我编写了一个C#控制台应用程序,它使用Interop.domino.dll程序集与domino / notes交互以创建,更新和删除文档.通过cmd提示符或Visual Studio手动运行应用程序时,应用程序成功运行.但是,当我们尝试将应用程序设置为计划任务(在域服务帐户下运行)时,它会失败,并
我编写了一个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,并且如果我们无法将控制台应用程序作为计划任务运行,那么它将沿着这条路走下去.但是,如果可能的话,我们想利用我已经写过的内容.

更新01/05/12

我已经尝试按照@ dna-man解决方案编写NOTESNTSERVICE OS环境变量.但是,这并没有解决问题.

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

有一个答案暗示了这种方法,但似乎已被删除,因此我无法将其标记为正确.我可以稍微打开这个问题,看看是否有其他人有任何建议.

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读