c# - .net 应用程序在通过计划任务触发时失败

标签 c# .net windows scheduled-tasks console-application

我有一个用 c# 编写的 .net 控制台应用程序,当它在 visual studio 中运行时以及在文件系统中单击 .exe 文件时,它的功能完全正确。它运行起来就像一个魅力。但是,当我在我的 Windows 7 开发机或 Windows 2008 R2 生产机中创建计划的 Windows 任务时,它无法执行应用程序中的最后一步。这一步是在后台打开一个 .doc 并将其转换(只需运行另存为)到 .docx。

该应用程序旨在访问网络路径,创建一个名为 ~Converted 的目录,它没有问题,然后对于每个 .doc,它发现它在后台打开,执行另存为,然后保存一个 .docx 版本的 do在 ~Converted 目录中。我相信代码没有任何问题,因为它可以在计划任务之外毫无问题地构建和运行。我探索了任务中的每个设置,进行了更改并重新测试但没有成功。我正在与属于管理员组的用户一起运行它,IMO 权限不是问题。我用 NETWORK SERVICE 帐户试过,结果相同。

仅在运行计划任务时才会生成的实际堆栈跟踪错误是:

System.UnauthorizedAccessException: Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).

执行此操作的代码行是:

Application oWord = new Application();

我已经为此搜索了几个小时,但没有找到任何帮助。当代码打开/初始化文档文档时,似乎通过任务运行代码会导致 COM 访问问题。该任务很有趣,具有完全的管理员权限,以最高权限运行以及用户是否登录。正如我所说,所有这些设置都已使用过,但没有任何区别。

现在已经到了这样的阶段,如果我不能解决这个问题,我将不得不将这个控制台应用程序重新编写为服务。希望有人能为我节省一整天的额外工作并帮助我解决这个问题??

添加 - 基于下面@Dmitry Martovoi 的帖子,我为 EVERYONE 用户添加了标记,堆栈跟踪已更改为:

System.NullReferenceException: Object reference not set to an instance of an object.

在同一个 saveAs 函数中指向这一行:

oDoc.Close(false, Type.Missing, Type.Missing);

添加 - 我一直在更改拥有此路径的用户,我不确定是哪个用户在运行它,这是生成的。这是一个应用程序事件日志错误。注意 - 这仅在通过任务调度程序运行应用程序时发生:

Faulting application name: WINWORD.EXE, version: 14.0.6129.5000, time stamp: 0x5082f340
Faulting module name: btmofficea.dll, version: 3.0.2.280, time stamp: 0x4cc57919
Exception code: 0xc0000005
Fault offset: 0x0000000000005e1f
Faulting process id: 0x2a6c
Faulting application start time: 0x01ce8bec64ccf85d
Faulting application path: C:\Program Files\Microsoft Office\Office14\WINWORD.EXE
Faulting module path: C:\Program Files\Motorola\Bluetooth\btmofficea.dll
Report Id: a393403d-f7df-11e2-b68c-74de2b9ca154

确定问题已解决。从链接中可以看出,@dmay 粘贴了 MS 不建议在服务器端无人值守运行办公应用程序,并说这是不受支持的。然而,解决方案正朝着@Dmitry 的方向发展:

1)开始->运行->dcomcnfg

2) 组件服务->计算机->我的电脑

3) 右击我的电脑,属性

4) COM 安全选项卡,启动和激活权限,编辑默认值

5) 为 NETWORK SERVICE 添加所有访问权限(这显然是最好用的帐户),您正在使用它来运行计划任务

6) 右击我的电脑 > DCOM 配置 > Microsoft Word 97 - 2003 文档 > 属性

7) 转到身份选项卡并勾选交互式用户

8) 转到“安全”选项卡并检查所有三个部分的自定义设置。确保 NETWORK SERVICE 显示并勾选了选项。这应该是第 5 步的结果。

9) 对于其他办公文档类型,从步骤 6 开始重复。我已经为 xls 和 mdb 这样做了

10) 重启....现在一切正常

抱歉,我应该添加这个。如果在第 7 步看不到这些:

               'Microsoft Word 97 - 2003 Document'

               'Microsoft Excel Application'

               'Microsoft Access Application

然后它可能是 64 位机器上的 32 位办公室安装,这里是 the solution使它们可见:

谢谢大家的宝贵时间

最佳答案

您应该授予指定用户访问 COM 自动化工厂的权限:

  • 1) 开始->运行->dcomcnfg
  • 2) 组件服务->计算机->我的电脑
  • 3) 右键单击​​“我的电脑”、“属性”
  • 4) COM 安全选项卡,启动和激活权限,编辑默认值
  • 5) 为指定用户添加所有访问权限,您正在使用它来运行 预定任务。

关于c# - .net 应用程序在通过计划任务触发时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17913670/

相关文章:

windows - 无法对打开了用户映射部分的文件执行请求的操作

c++ - 如何重新加载隐式链接的dll

c# - 锁定抽象类中的静态或实例变量

c# - 如何在文本区域的文本末尾显示省略号 (...)?

c# - 如何使用 linq 树表达式创建具有动态列的数据透视表

c# - 距离变换.NET

c++ - 查看进程内存映射的最佳程序是什么?

c# - 在一行中设置多个变量

c# - 如何避免在 .NET Windows 窗体中创建重复的窗体?

c# - 针对关键字 var 评估的不同类型