ms-office - 从 Windows 计划任务创建 Word OLE 客户端会导致 ntdll 应用程序错误
问题描述
我们的正常工作流程是使用 Windows 计划任务来:
- 将文件从 rtf 批量转换为 pdf
- 操作 pdf 以添加条形码
- 聚合成一个 pdf
- 然后发送打印
这在 Windows Server 2008 上运行良好,但自从我们升级到 Windows Server 2019(生命周期结束等)后,我们遇到了一大堆问题。我们现在遇到了第一个障碍——甚至是实例化 Word OLE 客户端。错误不一致 - 一天该过程将成功完成,下一天它将立即失败。
我们的任务触发了一个 Dyalog APL 工作区,要执行的代码就在其中。出于调试目的,我设置了一个简化版本,它执行以下操作:
tries←0 ⍝ Initialise the try counter
Log'Attempting to create Word instance' ⍝
:Repeat ⍝ Keep trying to...
Word←⎕NEW'OleClient'(⊂'ClassName' 'Word.Application') ⍝ Create the Word Client instance
Word.Visible←1 ⍝ making the application visible
tries+←1 ⍝ and incrementing the try counter each time
Log'Try: ',⍕tries ⍝
:Until #.Word.PropList∊⍨⊂'Documents' ⍝ Until it has seemingly created successfully
:OrIf tries≥maxTries_create ⍝ ... or the tries have exceeded the maximum (currently 5)
⍝
'doc open'delayAndLog dl_open ⍝ With an optional external delay...
myWordDoc←Word.Documents.Open⊂docPath ⍝ open the specified test doc
⍝
'doc close'delayAndLog dl_close ⍝ With an optional external delay...
myWordDoc.Close 0 ⍝ close the doc (not saving)
⍝
'application quit'delayAndLog dl_quit ⍝ With an optional external delay...
Word.Application.Quit 0 ⍝ quit the word client
各种延迟保存在外部配置文件中。我没有包括读取这个配置文件,因为基本上这里显示的是实质内容。注意:我重试创建实例,因为有时我发现它只使用准系统方法进行实例化。延迟或重试似乎可以解决此问题。
这段代码将在我的非生产服务器(甚至有时在生产中)中运行得很好。今天,当我通过 IDE 运行它时它会运行良好,但是当作为 Windows 计划任务运行时,它会在打开文档时报告 DOMAIN ERROR。
我的观察是它短暂地创建了WINWORD.exe,即你可以在任务管理器中看到它,状态变为“暂停”,然后它消失了。在事件查看器中,我们看到以下内容:
到目前为止我尝试过的事情
- 重新启动服务器(是的,你在开玩笑,但我们应该始终尝试的第一件事就是将其关闭再打开)
- 修复办公室
- 重新安装办公室
- 尝试将任务配置为以其他用户身份运行(我自己,具有本地管理员权限)
- 尝试将任务配置为在不同的服务器上运行。
- 尝试将任务配置为以更高的优先级运行。
- 使 Word 实例可见,以查看是否有任何错误弹出窗口。
- 构建了任务的简化版本(见上文),以确保它不仅仅是主要任务的整体复杂性导致混乱。
- 根据微软的建议禁用“自动墨迹书写”
- 捕获错误的 procmon 日志(等待 Microsoft 审核)
当前安装的版本:
- Word:Microsoft Word 2019 MSO (16.0.10374.20040) 64 位
- Dyalog APL:16.0.35960.0 32 位 Unicode
- Windows Server 2019 标准版 1809。操作系统内部版本 17763.1697。
任何帮助都会非常感激,因为我觉得我正在处理薛定谔的 OLE 客户端。提前致谢。
解决方案
- 那是Word中的崩溃。
c:\Users<yourname>\AppData\Local\Temp\ 或 c:\Users<yourname>\AppData\Local\CrashDumps 中可能有故障转储文件。
在您的公司,如果您有任何可以使用 Visual Studio 或 Windbg 的 C 开发人员,他们可以打开转储文件并查看它是否提供任何线索。
如果没有,如果您将其发送给 Dyalog 支持,我可以快速查看一下。
- 这只是一个猜测...您是否尝试过增加桌面堆的大小?请参阅此博客文章: https ://docs.microsoft.com/en-us/archive/blogs/ntdebugging/desktop-heap-overview
问候,
文斯
推荐阅读
- java - Apache Flink Python Table API UDF 依赖问题
- reactjs - MUI 网格系统
- arrays - 如何在分类器 fitcknn 中使用距离函数 dtw
- javascript - 用户登录后如何显示弹出消息?
- kubernetes-helm - 如何告诉 Helm 要安装哪个 repo 和 chart?
- apache-kafka - Kafka Cluster 和 Kafka Broker 有什么区别?
- ansible - 带有循环的 Ansible known_hosts 模块
- python - Spacy EntityRuler 合并/编辑实体?
- sql - 将一行拆分为三个单独的行
- javascript - 使用 Webpack 后出现 ReferenceError?