Проблема
У меня есть Сценарий 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" (не волнуются, это долгое время не оставалось как этот, ха-ха),CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers.
Execute Permissions
кому: Scripts and Executables
на Вашем веб-сайтеshell_exec
бит просто пропускается.Огромное спасибо за рассмотрение этого вопроса, я теперь вытаскиваю волосы с проблемой
С наилучшими пожеланиями, Iain
Обновление 1
Я действительно не хотел делать это, но как временная замена, пока я не нахожу надлежащее решение, я выполняю Apache на веб-сервере (который выполняет shell_exec штраф) и я называю свой апачский сценарий через ЗАВИХРЕНИЕ. Это ужасно, но это работает :).
Обновление 2
Я начинаю думать, что это не так проблема с IIS или полномочиями как таковыми, но возможно результат некоторой политики, которую мы имеем в нашей сети - хотя я не могу вообразить что. Какие-либо идеи от левого из поля?
пара примечаний
если вы хотите запустить .exe напрямую, вы можете использовать proc_open () с $ other_options = array ('bypass_shell' => TRUE)
также procmon.exe (sysinternals) - ваш лучший друг при изучении этого класса проблем
Я бы сказал разрешение на чтение и выполнение
пользователю, который запускает IIS (если это не IUSR_MACHINENAME)
Вот несколько моментов:
shell_exec
, убедитесь, что PHP не работает в безопасном режиме. Из руководства PHP - на странице shell_exe : Примечание: эта функция отключена, когда PHP работает в безопасном режиме.
Также похоже, что это довольно известная проблема с выполнением команд оболочки из PHP в Windows. Похоже, что консенсус состоит в том, что лучший способ заставить его работать - это запустить PHP в режиме FastCGI (я знаю, что вы уже пробовали это и сказали, что не можете заставить его работать - отсюда мой второй пункт). Вы можете найти эту ветку форума Microsoft IIS полезной.
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 дают вам больше контроля над процессом аутентификации и авторизации.
К сожалению, мне нужно использовать IIS, потому что я собираюсь аутентифицировать своих пользователей в активном каталоге.
Предпосылка для создания вашего приложения на IIS ошибочна. Ничто не мешает вам делать это с Apache. В самом деле, вам даже не нужно запускать его в ОС MS-Windows.
Сделайте гугл, чтобы узнать, как все это настроить.
Обратите внимание, что с IIS и локальными клиентами, потенциально использующими NTLM, политика безопасности оказывается вне поля зрения. Поток обработчика IIS может работать с учетными данными клиента NTLM MSIE. Или нет. Отладка этого материала сведет вас с ума!
С.