Как заставить shell_exec работать на IIS 6.0

Проблема

У меня есть Сценарий PHP, который использует shell_exec выполнять преобразователь PDF к тексту. Для упрощения проблемы, я создал короткий сценарий, который использует shell_exec просто повторить вывод dir команда.

<?php
$cmd = 'C:\\WINDOWS\\system32\\cmd.exe /c ';
echo shell_exec($cmd.' dir');
?>

Когда я выполняю это на своем сервере Apache, все работает как ожидалось. Когда я переключаюсь на IIS, это - как будто строка пропускается полностью: никакие ошибки, никакой вывод, никакие журналы, нет ничто.

К сожалению, я должен использовать IIS, потому что я собираюсь аутентифицировать своих пользователей против активного каталога.


Вот то, что я попробовал до сих пор:

  • Дайте команду через cmd.exe /c вместо того, чтобы выпускать его непосредственно
  • Дать Read & Execute разрешение к SERVICE на "C:\WINDOWS\system32\cmd.exe"
  • Дать Read & Execute разрешение к NETWORK SERVICE на "C:\WINDOWS\system32\cmd.exe"
  • Дать Read & Execute разрешение к IUSR_MACHINENAME на "C:\WINDOWS\system32\cmd.exe"
  • Дать Read & Execute разрешение к Everyone на "C:\WINDOWS\system32\cmd.exe" (не волнуются, это долгое время не оставалось как этот, ха-ха),
  • Выполненный PHP как модуль ASAPI
    • Это - моя стандартная конфигурация
  • Выполненный PHP как расширение CGI
    • Это не работает, я получаю ошибку: CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers.
  • В менеджере по IIS, наборе Execute Permissions кому: Scripts and Executables на Вашем веб-сайте
  • Добавленная разметка HTML и другой php функционируют к сценарию, чтобы видеть, обрабатывается ли это; это делает. Это как будто shell_exec бит просто пропускается.

Огромное спасибо за рассмотрение этого вопроса, я теперь вытаскиваю волосы с проблемой

С наилучшими пожеланиями, Iain


Обновление 1

Я действительно не хотел делать это, но как временная замена, пока я не нахожу надлежащее решение, я выполняю Apache на веб-сервере (который выполняет shell_exec штраф) и я называю свой апачский сценарий через ЗАВИХРЕНИЕ. Это ужасно, но это работает :).


Обновление 2

Я начинаю думать, что это не так проблема с IIS или полномочиями как таковыми, но возможно результат некоторой политики, которую мы имеем в нашей сети - хотя я не могу вообразить что. Какие-либо идеи от левого из поля?

5
задан Iain Fraser 23 February 2010 в 23:39
поделиться

4 ответа

пара примечаний

если вы хотите запустить .exe напрямую, вы можете использовать proc_open () с $ other_options = array ('bypass_shell' => TRUE)

также procmon.exe (sysinternals) - ваш лучший друг при изучении этого класса проблем

1
ответ дан 14 December 2019 в 13:34
поделиться

Я бы сказал разрешение на чтение и выполнение пользователю, который запускает IIS (если это не IUSR_MACHINENAME)

0
ответ дан 14 December 2019 в 13:34
поделиться

Вот несколько моментов:

  • Что касается PHP, пропускающего функцию shell_exec , убедитесь, что PHP не работает в безопасном режиме. Из руководства PHP - на странице shell_exe :

Примечание: эта функция отключена, когда PHP работает в безопасном режиме.

Также похоже, что это довольно известная проблема с выполнением команд оболочки из PHP в Windows. Похоже, что консенсус состоит в том, что лучший способ заставить его работать - это запустить PHP в режиме FastCGI (я знаю, что вы уже пробовали это и сказали, что не можете заставить его работать - отсюда мой второй пункт). Вы можете найти эту ветку форума Microsoft IIS полезной.


  • Теперь, что касается запуска PHP в Windows для аутентификации в Active Directory - вам не нужно!

Apache обеспечивает аутентификацию LDAP через mod_auth_ldap . А PHP обеспечивает поддержку LDAP с помощью следующих функций:

Active Directory - это реализация LDAP. Итак, с любым клиентом LDAP вы можете выполнить аутентификацию в Active Directory.

P.S. Вы можете использовать Apache mod_auth_ldap или функции PHP LDAP - вам не нужно использовать оба одновременно, чтобы это работало. Apache mod_auth_ldap работает на уровне протокола HTTP, тогда как функции PHP LDAP дают вам больше контроля над процессом аутентификации и авторизации.

2
ответ дан 14 December 2019 в 13:34
поделиться

К сожалению, мне нужно использовать IIS, потому что я собираюсь аутентифицировать своих пользователей в активном каталоге.

Предпосылка для создания вашего приложения на IIS ошибочна. Ничто не мешает вам делать это с Apache. В самом деле, вам даже не нужно запускать его в ОС MS-Windows.

Сделайте гугл, чтобы узнать, как все это настроить.

Обратите внимание, что с IIS и локальными клиентами, потенциально использующими NTLM, политика безопасности оказывается вне поля зрения. Поток обработчика IIS может работать с учетными данными клиента NTLM MSIE. Или нет. Отладка этого материала сведет вас с ума!

С.

0
ответ дан 14 December 2019 в 13:34
поделиться