Как заставить shell_exec работать на IIS 6.0 - PullRequest
5 голосов
/ 19 февраля 2010

Проблема

У меня есть 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 Manager установите Execute Permissions на Scripts and Executables на своем веб-сайте
  • Добавлены html-разметка и другие функции php в скрипт, чтобы увидеть, обрабатывается ли это; оно делает. Как будто бит shell_exec просто пропускается.

Большое спасибо за внимание к этому вопросу, теперь я выдернула волосы из-за проблемы

Ура, Иэн


Обновление 1

Я действительно не хотел этого делать, но в качестве пробела, пока я не нашел правильное решение, я запускаю Apache на веб-сервере (который прекрасно работает с shell_exec) и вызываю свой скрипт apache через cURL. Это некрасиво, но работает :).


Обновление 2

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

Ответы [ 6 ]

3 голосов
/ 23 мая 2011

Ниже приведен более систематический способ определения пользователя, которому необходимо предоставить разрешение

.

Убедитесь, что у вас есть следующие исполняемые файлы в C: \ WINDOWS \ SYSTEM32 (или, более обобщенно,% systemroot% \ system32)

cmd.exe  
whoami.exe  

Проверьте текущий ACL для этих исполняемых файлов

c:\windows\system32> cacls cmd.exe  
c:\windows\system32> cacls whoami.exe  

Если пользователю «Все» не предоставлен доступ для чтения (R), тогда ВРЕМЕННО предоставьте следующее:

c:\windows\system32> cacls cmd.exe /E /G everyone:R  
c:\windows\system32> cacls whoami.exe /E /G everyone:R  

Создайте whoami.php со следующим содержимым

<code><?php  
$output = shell_exec("whoami");  
echo "<pre>$output
"; ?>

Загрузите whoami.php в веб-браузер и запишите отображаемое имя пользователя, например. в моем случае это показывало

ct29296 \ iusr_template

Отменить разрешение «Все», если оно было добавлено на вышеуказанных этапах

c:\windows\system32> cacls cmd.exe /E /R everyone  
c:\windows\system32> cacls whoami.exe /E /R everyone  

Предоставьте только имя пользователя, найденное на шаге 5, с разрешением Read + Execute (R) для cmd.exe

c:\windows\system32> cacls cmd.exe /E /G ct29296\iusr_template:R  

Не забудьте использовать правильное имя пользователя для своей системы.

См .: http://www.myfaqbase.com/index.php?q=php+shell_exec&ul=0&show=f

2 голосов
/ 01 марта 2010

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

  • Что касается 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 дают вам больший контроль над процессом аутентификации и авторизации.

1 голос
/ 24 февраля 2010

пара заметок

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

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

0 голосов
/ 25 апреля 2011

Я добавил пользователя NETWORK SERVICE с READ & EXECUTE, READ в каталоги, где находятся исполняемые файлы моего приложения. После этого изменения проблема исчезла. Тем не менее, также необходимо предоставить разрешения READ & EXECUTE, READ для IUSR_ для cmd.exe.

Решение, которое я получил отсюда http://forums.iis.net/t/1147892.aspx

0 голосов
/ 01 марта 2010

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

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

У Google есть, как все это настроить.

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

С.

0 голосов
/ 23 февраля 2010

Я бы сказал, Read & Execute разрешение для пользователя, который запускает IIS (если это не IUSR_MACHINENAME)

...