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

Mat*_*t41 8 .net c# 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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

oDoc.Close(false, Type.Missing, Type.Missing);
Run Code Online (Sandbox Code Playgroud)

添加 - 我一直在更改拥有此路径的用户,我不知道哪个用户正在运行它,这是生成的.这是一个应用程序事件日志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
Run Code Online (Sandbox Code Playgroud)

好的问题是固定的.从@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
Run Code Online (Sandbox Code Playgroud)

然后它可能是64位计算机上的32位办公室安装,这是使它们可见的解决方案:

谢谢大家的时间

Dzm*_*voi 8

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

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


Fra*_*ent 6

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

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

开始于(可选): c:\my application\executable 文件夹路径