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

Posted

技术标签:

【中文标题】.net 应用程序在通过计划任务触发时失败【英文标题】:.net application failing when fired via scheduled task 【发布时间】:2013-07-28 15:08:45 【问题描述】:

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

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

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

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

执行此操作的代码行是:

Application oWord = new Application();

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

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

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

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

在同一个 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

OK 问题已修复。从链接中可以看出@dmay 粘贴的 MS 不建议在服务器端运行无人值守的办公应用程序,并表示这是不受支持的。然而,解决方案已经走上了@Dmitry 的目标:

1) 开始->运行->dcomcnfg

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

3) 右键单击​​我的电脑,属性

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

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

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

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

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

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

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

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

               'Microsoft Word 97 - 2003 Document'

               'Microsoft Excel Application'

               'Microsoft Access Application

那么它可能是 64 位机器上的 32 位办公室安装,这里是 the solution 以使其可见:

感谢大家的宝贵时间

【问题讨论】:

对我来说似乎是权限问题。在 VS 中运行代码与单独运行代码完全不同。 VS 负责处理大部分事情,让开发人员的生活变得轻松。能否请您检查您用于运行计划任务的帐户是否具有访问网络路径的权限? 您好。是的,我在具有完全管理员权限的帐户下运行它。当前测试下的路径是本地C盘路径,也需要用户创建~Converted dir。 IMO 它与实际用户没有任何关系......但我非常坚持对所有建议持开放态度! 听起来您正在运行调度程序的服务器有几件事可能是问题.. 1. MS Word 是否安装在该服务器上? 2. 您是否部署了支持您在本地计算机上使用的 Word 版本的正确 .dll 3. 查看 GAC 以及复制 Microsoft Office dll 的正确版本 好酷;你能再尝试一件事吗?尝试通过双击 .exe 手动运行应用程序,看看它是否运行没有任何问题,以便我们可以将问题与计划任务的问题分开。抱歉,如果您已经这样做并且我错过了。谢谢 它在本地运行是的,我确实安装了 Word。你在说什么dll?我不确定GAC?我的理论是代码运行良好,没有涉及任务,所以我认为代码和相关的应用程序 dll/文件等应该没问题。我强烈怀疑这个 DCOM CONFIG 区域是问题所在。我只是猫找到了设置。 IMO 任务调度程序在访问 COM 时遇到安全问题.....帮助 【参考方案1】:

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

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

【讨论】:

看到这个回复我很兴奋。这看起来是一个非常好的建议!它对我不起作用。我添加了 abd 给了我的本地管理员用户,并且 NETWORK SERVICE 帐户在所有四个框中都打勾,并尝试代表两个用户运行任务,结果相同。还有其他想法吗? 我接受了这个答案,因为它完成了 80% 的工作。请注意我最初编辑的帖子中标记为 1-10 的步骤。步骤 1-5 是@Dmitry 建议的步骤【参考方案2】:

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

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

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

【讨论】:

感谢片段。你的回答真的对我有用。 感谢您提供简单的解决方案。它对我有用。 @Fragment 感谢您的解决方案。它对我有用而且很快。【参考方案3】:

首先,看看这个http://support.microsoft.com/?id=257757

你可以尝试几件事:

在真实用户帐户下运行您的任务(确保此帐户可以访问网络路径) 'Ogawa Hack',这里提到http://social.msdn.microsoft.com/Forums/en-US/b81a3c4e-62db-488b-af06-44421818ef91/excel-2007-automation-on-top-of-a-windows-server-2008-x64 为系统帐户C:\Windows\SysWOW64\config\systemprofile\Desktop(或\System32\,如果您的系统是32x)创建桌面文件夹

【讨论】:

我确实在周五发现了这个非常奇怪的创建 C:\Windows\SysWOW64\config\systemprofile\Desktop 文件夹的解决方案,这对我没有帮助。我的系统是 64,但我会把它放在 system32 下,因为目前我愿意尝试任何事情。我不喜欢将其重写为服务的想法。肯定有适合我的解决方案!!!! support.microsoft.com 链接不再有效。

以上是关于.net 应用程序在通过计划任务触发时失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET 程序之间共享信息

Windows 任务计划程序“忽略启动请求,实例已在运行”

为 Windows 开发计划任务

任务计划程序打开软件的原理

使用 PHP 和 Windows 任务计划程序在退出时重试(1)

在计算机启动时运行 powershell 网络脚本将失败