繁体   English   中英

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

[英].net application failing when fired via scheduled task

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

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

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

System.UnauthorizedAccessException:检索 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件的 COM class 工厂失败,原因是以下错误:80070005 访问被拒绝。 (HRESULT 异常:0x80070005 (E_ACCESSDENIED))。

这样做的代码行是:

Application oWord = new Application();

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

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

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

System.NullReferenceException:Object 引用未设置为 object 的实例。

它指向同一个 saveAs function 中的这一行:

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. Go 来标识Tab 并勾选交互用户

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

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

  10. 重新启动....现在一切正常

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

               'Microsoft Word 97 - 2003 Document'

               'Microsoft Excel Application'

               'Microsoft Access Application

那么它可能是 64 位机器上的 32 位办公室安装,这里是使它们可见的解决方案

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

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

面对类似的问题,当应用程序正常按预期工作时,但是当我从计划任务运行它时,它立即关闭,并抛出错误:“找不到文件路径...”。

通过设置计划任务操作参数修复它:

启动(可选): c:\\我的应用程序\\可执行文件夹路径

这对我来说似乎是一个权限问题。 在VS中运行代码与单独运行代码有太大的不同。 VS负责大部分工作,让开发人员的生活变得轻松。

您能否检查一下您用于运行计划任务的帐户是否有权访问网络路径?

首先,请查看此http://support.microsoft.com/?id=257757

你可以尝试一些事情:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM