Назад | Перейти на главную страницу

PHP exec () по пути UNC в Windows

Моя среда - это 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.

Вот что я пробовал / нашел:

Обратите внимание, что это не относится к 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-скрипт на общем ресурсе. Я спрошу, можно ли исправить это в будущем выпуске.