0

我在Windows Server 2012 R2上安裝了ImageMagick-6.9.2-8-Q16-x64-dll.exeGhostScriptImageMagic在IIS上拒絕的權限

執行convert "document.pdf" "thumbnail.jpg"命令行從PHP使用shell_exec或exec執行失敗,返回值爲1.如果我在命令提示符(cmd.exe)中手動運行相同的命令,它會無縫地創建pdf文件。

回答

1

在閱讀了許多文章和論壇之後,我遵循這些步驟使ImageMagic在IIS環境下工作。

  1. Temp目錄權限: 每當PHP文件上載到服務器,IIS將文件放置到C:\Windows\Temp目錄,並將其移動到目標目錄。在此過程中,上傳的文件將具有Temp目錄的固有所有權和許可權。默認情況下,這種繼承會阻止ImageMagic訪問它。爲了克服這個限制,IUSRIIS_USRS需要對Temp目錄具有讀/寫權限。 有關詳細的解釋請閱讀article
  2. Image Magic權限/應用程序池標識:由於在IIS用戶下服務時不允許PHP執行convert.exe,因此必須在IIS中創建/使用默認應用程序池。一旦配置了此池,您必須將權限授予ImageMagic目錄上的此池以及放置pdf文件的目錄。有關詳細說明,請閱讀thread。注意:一些文章建議IUSR或IIS_IUSR應該被授予執行cmd.exe的權限。這非常令人沮喪,因爲它可能爲安全漏洞創造一個窗口。
  3. 源和目標目錄權限:無論這個目錄需要有IUSRIIS_IUSR讀/寫權限
  4. 命令行語法:常見的錯誤,同時傳遞參數到命令行從PHP是路徑,反斜線需要逃脫。例如,而不是通過C:\Inetpub\vhosts\...它應該作爲C:\\Inetpub\\vhosts\\...通過。 下面是一個工作段的一個示例:

$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,則表示您仍然有權限問題需要解決:(

希望這會有所幫助。