我正在尝试在 Windows Server 2012 上安装共享的 MikTex,以便我的 Web 应用程序(Perl CGI / IIS 8)可以通过 pdflatex 动态生成 PDF 文件,并将它们发送给用户。
我设法通过在另一台机器上完全下载并传输文件(服务器没有网络访问权限)在服务器上安装了 MikTex 2.9.6637 (x64),并且它可以通过命令行运行。
但是,当我尝试从 Web 服务器的 Perl/CGI 脚本运行命令时,我遇到了麻烦,当我将 IIS 配置为通过 Windows 帐户网络服务使用匿名身份验证时:拒绝访问。当我使用 IIS Windows 身份验证,并且脚本使用我自己的 Windows 帐户(管理员)运行时,它运行良好。绝对是访问管理问题。
我使用了此页面上的选项
http://docs.miktex.org/2.9/manual/setupwiz.html
为了配置一个简单的 D:\miktex_local 中的所有文件夹,我可以在该文件夹中授予此网络服务所有权限,而不是默认的 / 文件夹。我唯一没能自己配置的文件夹是位于以下位置的日志目录:C:\ProgramData\MiKTeX\2.9\miktex\log 但我授予了这个权限,而且即使我设法生成 pdf 时它似乎也没有被使用。
我的测试脚本可以在这些文件夹中写入内容,并生成日志。我还从脚本中测试用户是否对我的输入和输出文件夹具有读/写权限。
这是成功运行的日志(管理员用户):
2018-03-29 14:14:48,797+0200 INFO pdflatex - starting with command line: D:\miktex\miktex\bin\x64\pdflatex -output-directory=D:\test\out D:\test\in\token.tex
2018-03-29 14:14:48,797+0200 WARN pdflatex - running with administrator privileges
2018-03-29 14:14:48,813+0200 INFO pdflatex - allowing known shell commands
2018-03-29 14:14:48,813+0200 INFO pdflatex - enabling input (output) from (to) processes
2018-03-29 14:14:48,813+0200 INFO pdflatex - setting output directory: D:\test\out
2018-03-29 14:14:48,813+0200 INFO pdflatex - setting aux directory: D:\test\out
2018-03-29 14:14:49,610+0200 INFO pdflatex - finishing with exit code 0
这是一次失败运行的日志(网络服务用户):
2018-03-29 14:14:19,478+0200 INFO pdflatex - starting with command line: D:\miktex\miktex\bin\x64\pdflatex -output-directory=D:\test\out D:\test\in\token.tex
2018-03-29 14:14:19,478+0200 INFO pdflatex - allowing known shell commands
2018-03-29 14:14:19,478+0200 INFO pdflatex - enabling input (output) from (to) processes
2018-03-29 14:14:19,478+0200 INFO pdflatex - setting output directory: D:\test\out
2018-03-29 14:14:19,478+0200 INFO pdflatex - setting aux directory: D:\test\out
2018-03-29 14:14:19,509+0200 FATAL pdflatex - Windows API error 5: Access is denied.
2018-03-29 14:14:19,509+0200 FATAL pdflatex - Info: path="D:\test\in\token.tex"
2018-03-29 14:14:19,509+0200 FATAL pdflatex - Source: Libraries\MiKTeX\Core\PathName\PathName.cpp
2018-03-29 14:14:19,509+0200 FATAL pdflatex - Line: 156
2018-03-29 14:14:19,509+0200 INFO pdflatex - finishing with exit code 1
某些资源似乎存在访问问题,但我不知道是哪个。运行该命令的测试脚本可以读取输入 .tex 文件的内容,写入输出目录和日志目录,并且 pdflatex -help 没有给出任何错误。
我在使用 TexLive 时遇到过非常类似的问题,在管理员帐户下运行时工作正常,但在网络服务下运行时却出现神秘的“致命错误:无法获取 D:\texlive 的长名称”。
欢迎提供任何建议或指点,提前致谢。
答案1
我明白了。我相信错误源自与 texlive 相同的问题,来自以下行:
DWORD len = GetLongPathNameW(this->ToWideCharString().c_str(), longPathName, _MAX_PATH);
事实证明,我必须为我的 pdflatex 命令提供相对路径,因为出于某种原因,从此网络服务帐户运行时它不支持绝对路径。我将 test/in 和 test/out 移到了 wwwroot 中,经过以下小改动后,它就可以正常工作了:D:\miktex\miktex\bin\x64\pdflatex -output-directory=tex\out tex\in\token.tex