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

时间:2013-07-28 22:38:57

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

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

该应用程序旨在访问网络路径,创建一个名为~Converted的目录,它没有问题,然后对于每个.doc它发现它在后台打开,执行保存,并且它们保存了.docx版本的do在〜转换目录。我相信代码没有任何问题,因为它在计划任务之外构建和运行没有问题。我已经探索了任务中的每一个环境,进行了改动并重新测试但没有成功。我正在运行它与管理员组的一部分用户,IMO权限不是问题。我已经尝试使用NETWORK SERVICE帐户,结果相同。

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

  

System.UnauthorizedAccessException:由于以下错误,检索具有CLSID {000209FF-0000-0000-C000-000000000046}的组件的COM类工厂失败:80070005拒绝访问。 (HRESULT异常:0x80070005(E_ACCESSDENIED))。

执行此操作的代码行是:

Application oWord = new Application();

我已经搜索了几个小时,没有发现任何帮助。在代码打开/初始化单词doc时,似乎通过任务运行代码会导致COM访问问题。这项任务很有趣,具有完全的admim权限,以最高权限运行,以及用户登录时是否。正如我所说的所有这些设置一样,它没有任何区别。

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

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

  

System.NullReferenceException:未将对象引用设置为对象的实例。

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

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

添加 - 我一直在更改拥有此路径的用户,我不知道哪个用户正在运行它,这是生成的。这是一个应用程序事件日志erorr。注 - 只有在通过任务调度程序运行应用程序时才会发生这种情况:

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以使它们可见:

感谢大家的时间

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

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

开始(可选): c:\ my application \ executable folder path

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

你可以尝试一些事情: