IIS上的ImageMagic权限被拒绝

时间:2015-12-15 07:10:37

标签: pdf permissions imagemagick ghostscript windows-server-2012-r2

我在Windows Server 2012 R2上安装了ImageMagick-6.9.2-8-Q16-x64-dll.exe GhostScript

使用shell_exec或exec从PHP执行convert "document.pdf" "thumbnail.jpg"命令行失败,返回值为1.如果我在命令提示符(cmd.exe)中手动运行相同的命令,则无缝地创建pdf文件。

2 个答案:

答案 0 :(得分:1)

在浏览了很多文章和论坛后,这些是我使ImageMagic在IIS环境中工作的步骤。

  1. 临时目录权限: 每当PHP将文件上传到服务器时,IIS都会将文件放到C:\Windows\Temp目录并将其移动到目标目录。在此过程中,上载的文件将具有Temp目录的固有所有权和权限。默认情况下,此继承将阻止ImageMagic访问它。要克服此限制,IUSRIIS_USRS需要具有Temp目录的读/写权限。 有关详细说明,请阅读此article
  2. 图像魔术许可/应用程序池标识:由于在IIS用户下提供服务时不允许执行convert.exe,因此必须在IIS中创建/使用默认应用程序池。配置此池后,您必须在ImageMagic目录和pdf文件所在的目录中授予此池的权限。有关详细说明,请阅读此thread。注意:有些文章建议IUSR或IIS_IUSR应该被授予执行cmd.exe的权限。这是非常沮丧的,因为它可以为安全漏洞创建一个窗口。
  3. 源和目标目录权限:这两个目录都需要具有IUSRIIS_IUSR读/写权限
  4. 命令行语法:从PHP向命令行传递参数时常见的错误是路径,反斜杠需要转义。例如,不应传递C:\Inetpub\vhosts\...,而应将其作为C:\\Inetpub\\vhosts\\...传递。 以下是工作代码段的示例:
  5. $cmd = 'convert "C:\\Inetpub\\vhosts\\a\\doc.pdf[0]" "C:\\Inetpub\\vhosts\\b\\thumb\\a.jpg"';
    $output = "";
    $result = exec($cmd, $output);

    print_r($output); //var_dump($output);

    请注意,整个命令用单引号括起来,源文件和目标文件用双引号括起来。

    <强>调试: PHP不会报告在执行命令行期间可能发生的任何错误。如果遇到错误,则无提示失败。要调试从命令行发送的输出,建议使用exec。此函数允许您传递一个输出变量,该变量将使用包含命令行响应的数组填充。从这里你可以使用var_dump,print_r来显示输出。如果此值的值为1或4,则表示您仍有必须解决的权限问题:(

    希望这有帮助。

答案 1 :(得分:0)

我们在ASP.NET应用程序中观察到相同的问题。我们通过确保已正确处理ImageMagick对象来解决它

注意:我们将ImageMagick对象包装在Using语句内。没用 我们已经明确关闭了该对象。