8

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

该应用程序旨在访问网络路径,创建一个名为 ~Converted 的目录,它没有问题,然后对于它发现它在后台打开的每个 .doc,执行另存为,然后他们将 do 的 .docx 版本保存在 ~转换目录。我相信代码没有任何问题,因为它在计划任务之外构建和运行时没有问题。我已经探索了任务中的每个设置,进行了更改并重新测试,但没有成功。我正在使用属于管理员组的用户运行它,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) 从第 6 步开始重复其他 office 文档类型。我已经为 xls 和 mdb 这样做了

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

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

               'Microsoft Word 97 - 2003 Document'

               'Microsoft Excel Application'

               'Microsoft Access Application

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

谢谢大家的时间

4

3 回答 3

9

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

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

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

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

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

于 2015-07-23T10:29:43.877 回答
0

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

你可以尝试几件事:

于 2013-07-28T22:53:02.850 回答