Отладка ошибки PHP в IIS (как это связано с вызовами com-объектов)

Этот вопрос связан с другим вопросом, который я написал:

Проблема с использованием DOTNET с PHP.

Где я использовал DOTNET() в PHP для вызова DLL, которую я написал.

Я смог заставить его работать нормально, запустив php.exe example.php из командной строки (при этом DLL все еще находится в папке PHP).

Я переместил файл php в папку веб-сервера IIS 7 на том же компьютере (оставив библиотеки DLL в одной и той же папке php), но я продолжаю получать внутреннюю служебную ошибку 500 .

Я проверил журналы сервера (в c:\inetput\logs\ и в c:\windows\temp\php53errors ), но, похоже, не существует какой-либо релевантной информации о том, что вызвало ошибку. Я даже пытался изменить настройки php.ini , чтобы получить больше отзывов об ошибках, но это, похоже, не помогает.

Я могу только догадываться, что проблема может быть связана с:

  1. что php-файл не имеет надлежащих разрешений (моя dll выполняет некоторые чтения / записи файлов)
  2. php не может найти DLL

Фактическая ошибка, которую я получаю:

Процесс FastCGI неожиданно вышел из системы.

Любая идея о том, как отладить эту проблему?

Проблема здесь почти наверняка связана с правами доступа к файлам.

Когда вы запускаете php.exe из командной строки, вы запускаете ее как своего собственного зарегистрированного пользователя. При запуске PHP-скрипта из IIS в ответ на HTTP-запрос php.exe работает как другой пользователь. В зависимости от вашей версии Windows это может быть

  • IUSR_machine – на IIS6 и ранее
  • IUSR на IIS7 и более поздних версиях

Этим пользователям необходимы разрешения для исполняемого файла php.

Подробнее об этом

В IIS7 и более поздних версиях я использую средство командной строки icacls.exe для установки разрешений на каталоги или файлы, которые должны быть прочитаны IIS и запущенными процессами (например, php.exe). Этот материал безопасности применяется ко всем приложениям IIS: PHP, ASPNET, ASP-classic, Python и т. Д.

IIS также должен иметь возможность читать статические файлы, такие как файлы .htm, .js, .css, .jpog, .png и т. Д. Вы можете установить одинаковые разрешения для всех: Read и Execute.

Вы можете предоставить разрешения непосредственно пользователю, например:

  icacls.exe YOUR-FILE-GOES-HERE /grant "NT AUTHORITY\IUSR:(RX)" 

Вы также можете предоставить разрешения группе, к которой принадлежит IUSR, например:

  icacls.exe YOUR-FILE-HERE /grant "BUILTIN\IIS_IUSRS:(RX)" 

В любом случае вам может потребоваться остановить и перезапустить IIS после установки разрешений на уровне файлов.

Если ваш скрипт .php читает и записывает другие файлы или каталоги, то одному и тому же пользователю нужны привилегии для этих других файлов и каталогов. Если вам нужен скрипт .php для удаления файлов, тогда вам может понадобиться

  icacls.exe YOUR-FILE-HERE /grant "BUILTIN\IIS_IUSRS:(F)" 

… который предоставляет полные права на файл.

Вы также можете предоставить разрешения для всей каталогов, указав, что все файлы, созданные в этом каталоге в будущем , наследуют разрешающие файлы разрешения, установленные в каталоге. Например, установите файл perms для каталога, затем скопируйте в него кучу файлов, и все файлы получат разрешения от родителя. Сделайте это с помощью флагов OI и CI (эти инициалы означают «наследование объекта» и «наследование контейнера»).

  icacls.exe DIRECTORY /grant "BUILTIN\IIS_IUSRS:(OI)(CI)(RX)" copy FILE1 DIRECTORY copy FILE2 DIRECTORY ... 

Когда я хочу создать новый vdir в IIS, чтобы разрешить запуск PHP-скриптов или ASPX или .JS (да, ASP Classic) или Python или что-то еще, я делаю следующие шаги:

 appcmd.exe add app /site.name:"Default Web Site" /path:/vdirpath /physicalPath:c:\docroot icacls.exe DIRECTORY /grant "BUILTIN\IIS_IUSRS:(OI)(CI)(RX)" 

Затем я отбрасываю файлы в каталог и получаю соответствующие разрешения.

Установка ACL (списка управления доступом) в каталоге не изменит ACL для файлов, которые уже существуют в каталоге. Если вы хотите установить разрешения для файлов, которые уже находятся в каталоге, вам нужно использовать icacls.exe для определенных файлов. icacls принимает подстановочные знаки, а также имеет переключатель /t который повторяется.