我有一个用 C# 编写的 .net 控制台应用程序,它在 Visual Studio 中运行以及单击文件系统中的 .exe 文件时完全执行其应有的操作。它运行起来就像一个魅力。但是,当我在 Windows 7 开发计算机或 Windows 2008 R2 产品计算机中创建计划的 Windows 任务时,它无法执行应用程序中的最后一步。此步骤是在后台打开 .doc 并将其隐藏(只需运行另存为)为 .docx。
该应用程序设计为访问网络路径,创建一个名为 ~Converted 的目录,它不会出现问题,然后对于每个 .doc 它发现它在后台打开,执行另存为并将 .docx 版本的 do 保存在 ~ 中转换后的目录我相信代码没有任何问题,因为它在计划任务之外构建和运行没有问题。我探索了任务中的每一个设置,进行了修改并重新测试,但没有成功。我正在与属于管理员组的用户一起运行它,IMO 权限不是问题。我已经用网络服务帐户尝试过,结果相同。
仅在运行计划任务时才会生成的实际堆栈跟踪错误是:
System.UnauthorizedAccessException:由于以下错误,检索 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件的 COM 类工厂失败:80070005 访问被拒绝。 (HRESULT 异常:0x80070005 (E_ACCESSDENIED))。
执行此操作的代码行是:
Application oWord = new Application();
我已经搜索了几个小时,但没有发现任何有用的东西。当代码打开/初始化 Word 文档时,通过任务运行代码似乎会导致 COM 访问问题。该任务具有完整的 admim 权限、以最高权限运行以及用户是否登录。正如我所说,所有这些设置都已被使用过,但没有产生任何影响。
现在已经到了这样的阶段:如果我无法解决这个问题,我将不得不将这个控制台应用程序重写为服务。希望有人可以节省我一整天的额外工作并帮助我解决这个问题?
添加 - 根据下面的 @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
好的问题已解决。从@dmay 粘贴的链接中可以看出,MS 不建议在服务器端运行无人值守的办公应用程序,并表示这是不受支持的。然而,解决方案是沿着 @Dmitry 的方向发展的:
-
开始->运行->dcomcnfg
-
组件服务->计算机->我的电脑
-
右键单击我的电脑,属性
-
COM 安全选项卡、启动和激活权限、编辑默认值
-
添加网络服务的所有访问权限(这显然是最好使用的帐户),您正在使用它来运行计划任务
-
右键单击“我的电脑”>“DCOM 配置”>“Microsoft Word 97 - 2003 文档”>“属性”
-
转到身份选项卡并勾选交互式用户
-
转到“安全”选项卡并检查所有三个部分的自定义设置。确保网络服务显示并勾选了选项。这应该是步骤 5 的结果。
-
对于其他 Office 文档类型,请重复步骤 6。我已经对 xls 和 mdb 这样做了
-
重新启动......现在一切正常
抱歉我应该添加这个。如果您在第 7 步看不到这些:
'Microsoft Word 97 - 2003 Document'
'Microsoft Excel Application'
'Microsoft Access Application
那么它可能是在64位机器上安装32位office,这里是解决方案 http://blogs.technet.com/b/the_microsoft_excel_support_team_blog/archive/2012/11/12/microsoft-excel-does-not-appear-in-dcom-configuration-snap-in.aspx让它们可见: