Возможные ошибки при использовании команд exec в PHP

У нас есть небольшая офисная интрасеть, построенная на PHP (на сервере Apache – так WAMP), что позволяет нам создавать папки проектов на нашем файловом сервере. Это работает путем копирования набора папок шаблонов в новое место с помощью команды exec xcopy и следующих переключателей /e /k /i /c .

Недавно мы (довольно) обновились до нового файлового сервера под управлением Windows Server 2008 R2 Standard. Теперь команда xcopy больше не работает из PHP. Тем не менее, я знаю, что команда xcopy верна, потому что она работает, если я скопирую и вставляю ее в командную строку (на том же компьютере).

Я не вижу сообщения об ошибке, но я предполагаю, что это какая-то проблема с правами доступа, связанная с пользователем PHP, но я не знаю точно, что и как ее решить.

Сервер Apache и файловый сервер – это две отдельные машины. Если это актуально, сервер apache – это 32-битный компьютер, а файловый сервер – 64-битный, но, как я уже сказал, я могу без проблем вызвать команду xcopy из CLI 32-битной машины.

Имя пользователя процесса Apache – SYSTEM (хотя я не могу использовать команду «whoami», чтобы проверить это)

Любые указатели будут очень благодарны.

FWIW, строка exec выглядит так …

 echo "xcopy \"\\\\path\\to\\folder\\xxxx_Project\\*.*\" \"\\\\path\\to\\folder\\9876_NEWPROJECT\" /e /k /i /c"; 

который (я думаю) материализуется как это …

 xcopy "\\path\to\folder\xxxx_Project\*.*" "\\path\to\folder\9876_NEWPROJECT" /e /k /i /c 

Очевидно, что бит 9876_NEWPROJECT – это действительно переменная.

get_current_user() будет подтверждать, что ваш скрипт работает как.

Затем попробуйте вручную выполнить команду в качестве этого пользователя с помощью runas (или если ваш пользователь действительно является SYSTEM тогда вам понадобится что-то вроде psexec ).

Теперь, предполагая, что ваш скрипт фактически работает как SYSTEM , очень вероятно, что этот пользователь не авторизовался на удаленном файловом сервере. Я не думаю, что это возможно даже (за исключением, возможно, разрешения «Все»). Если это так, я не уверен, что это хорошая идея.

Вместо этого я запустил бы службу apache как обычный пользователь , а на файловом сервере предоставил бы доступ к этому пользователю.

В качестве альтернативы вы можете смонтировать удаленное местоположение в качестве сетевого диска (не протестировано, другие ответы в потоке также могут помочь).

ОК. Кажется, у меня это работает. Вот что я сделал – скажите мне, если это плохая идея, хотя я должен указать, что это интрасеть, поэтому я немного меньше беспокоюсь о безопасности …

  1. Перейдите в Панель управления-> Администрирование Tools_> Службы

  2. Выберите службу Apache и нажмите Свойства.

  3. На вкладке «Вход в систему» ​​нажмите «Эта учетная запись:» вместо «Локальная учетная запись системы», а затем найдите учетную запись пользователя пользователя Windows, которая обычно регистрируется на этом терминале

  4. Перезапустить Apache

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

Если есть лучшее решение, которое можно объяснить словами двух слогов или меньше, я все уши!