问题
当 CF 作为服务运行与 CF 在控制台模式下运行时,在权限方面出现的区别是什么?
历史
我有一个为 Word.Application 创建 COM 对象并使用它们将 DOC 转换为 PDF 的代码。但是当我转到 CF 10u8 (64b) 时,逻辑就崩溃了。我检查了互联网,改变了 java.library.path={} 值、权限和所有可能的提示以使其工作;但没有成功。我在 Adobe Bug Base 中找到了一个条目,以确认 jintegra\bin\ntvinv.dll 设计为在 32b 环境中工作。
所以,我求助于使用 VB 脚本模式将我的 CF 代码转换为 VB 脚本,并将我的 DOC 转换为 PDF。
问题
VB Script 中的代码很漂亮,它很快就完成了我需要的工作。在我从 <cfexecute> 调用这个 .vbs 之前,这似乎没问题。它永远处理,超时并且什么都没有显示+任务管理器中有WINWORD.exe的废弃进程。
我尝试将参数写入批处理文件并调用它。这次它立即运行,但没有任何反应。我检查了日志,它显示
Microsoft VBScript 运行时错误:需要对象:'wdocs.Open(...)
我从命令提示符调用批处理文件,它执行没有错误。我的 DOC -> PDF 转换完成。
所以,这次我将 ColdFusion 服务的“登录为...”权限从“本地系统帐户”更改为系统的管理员用户帐户并启动它。我明白了,
本地计算机上的 CF 10 应用程序服务器服务启动然后停止。如果某些服务没有被其他服务或程序使用,它们会自动停止
所以,路的尽头。我尝试过使用“允许服务与桌面交互”选项。但没有任何改善。
最后,我尝试从 bin\cfstart.bat 文件运行 CF。它有coldfusion.exe -start -console。命令窗口出现,CF 启动。这一次, <cfexecute> 起作用并且发生了转换。没有看到错误。我很困惑为什么会这样。使用系统帐户(谁登录)将其作为服务运行与使用相同用户帐户作为控制台运行有什么区别?我想了解什么?
调试
我在服务器上创建了一个本地用户帐户,并在“登录为...”以及使用相同帐户登录系统时都使用了该帐户。在这两种情况下,它与上面的故事相同。
我觉得这是一个许可问题,我想不通的是在哪里以及为什么会发生这种情况?特别是为什么在服务模式而不是控制台模式下?
注意:在使用 VBS 之前,我曾尝试使用 <cfdocument format="pdf" ... >,但由于我的 DOC 中的某些特定格式,它会引发异常。所以,它现在不是一个选择。
信用:我在 VBScript 中的代码是从这里派生的
更新
这是我的代码,您可以使用它进行测试。
命令行代码
/c <pathToTheScriptFile>/doc2pdf.vbs <absolutePathTo>aWordDocument.doc o/:<absolutePathTo>finalPDFDocument.pdf
doc2pdf.vbs 有两个参数。第一个是 wordDocument 名称(带路径),第二个是可选的 PDFDocument 名称。如果未传递可选参数,则为 PDFDocument 赋予 wordDocument 的相同名称。
冷融合代码
<cfexecute name="c:\windows\system32\cmd.exe" arguments="#commands#" outputFile="output.txt" errorFile="error.txt" timeout="20"/>
或者您也尝试使用 Java 运行时对象
<cfscript>
objJR = createObject("java", "java.lang.Runtime").getRuntime();
result = objJR.exec(commands);
writeDump(result);
</cfscript>
要在本地机器上运行它,您需要
- 安装了带有“另存为 PDF”插件的 MS Word 2007 或更高版本。
- VBScript(从这里获取)
- CF 10。我正在更新 8。这适用于任何更新级别。