Моя среда - это Windows Server 2012 R2, IIS 8, Active Directory и общий файловый ресурс. IIS, AD и общий файловый ресурс - это отдельные виртуальные машины.
У меня есть веб-сайт www.example.com, созданный в IIS. Удостоверение пула приложений настроено как пользователь AD. IUSR_example
, который имеет права «полного контроля» над папкой, содержащей файлы сайта. Файлы сайта находятся в общей папке, на которую IIS ссылается через UNC-путь.
В целом сайт работает так, что он может обслуживать страницы PHP, ASP.Net и ASP Classic, а код может даже создавать новые файлы.
Тем не мение, У меня проблема, которая кажется специфичной для PHP exec()
. Я пробовал позвонить whoami
, dir
, и ffmpeg
, и я ничего от них не получаю. Используя Sysinternals Procmon, я подтвердил, что исполняемый файл никогда не запускается.
Как ни странно, я я возможность совершать те же вызовы с ASP Classic (используя WScript.Shell
), и он отлично работает. Я также могу получить PHP exec()
работает, когда сценарии НЕ выполняются по пути UNC.
Вот что я пробовал / нашел:
cmd.exe /c ""--the command to be executed--""
IUSR_example
2>&1
до конца командыОбратите внимание, что это не относится к ffmpeg. Любое другое использование exec()
тоже не получается. Кроме того, я бы предпочел не использовать WScript.Shell
из PHP, потому что в конечном итоге мы будем использовать плагины WordPress, которые полагаются на exec()
.
Как я могу решить эту проблему?
Так как предложил пользователем "pajoye" на bugs.php.net, используя proc_open()
позволил мне успешно выполнять команды. Это, в свою очередь, позволило мне использовать procmon, чтобы обнаружить разницу между способами exec()
и proc_open()
работай. Короче говоря, я бы назвал это основной ошибкой в PHP, работающем в Windows, когда скрипты PHP находятся в общей сетевой папке. Вот основные детали:
exec()
по умолчанию текущий рабочий каталог соответствует пути сценария PHP, который в моем случае является путем UNC.cmd.exe
не позволяет использовать UNC-путь в качестве текущего рабочего каталога, и cmd.exe
утверждает, что он вернется в папку Windows.cmd.exe
продолжает выполнять и conhost.exe
создается, исходный рабочий каталог по-прежнему вызывает какие-то проблемы, а нужный исполняемый файл никогда не запускается.Итак, простой обходной путь - chdir()
в локальный каталог перед звонком exec()
. Однако есть много плагинов WordPress, которые полагаются на exec()
так что на мой взгляд exec()
должен быть независимым от того, работает ли PHP-скрипт на общем ресурсе. Я спрошу, можно ли исправить это в будущем выпуске.