У нас есть небольшая офисная интрасеть, построенная на 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 как обычный пользователь , а на файловом сервере предоставил бы доступ к этому пользователю.
В качестве альтернативы вы можете смонтировать удаленное местоположение в качестве сетевого диска (не протестировано, другие ответы в потоке также могут помочь).
ОК. Кажется, у меня это работает. Вот что я сделал – скажите мне, если это плохая идея, хотя я должен указать, что это интрасеть, поэтому я немного меньше беспокоюсь о безопасности …
Перейдите в Панель управления-> Администрирование Tools_> Службы
Выберите службу Apache и нажмите Свойства.
На вкладке «Вход в систему» нажмите «Эта учетная запись:» вместо «Локальная учетная запись системы», а затем найдите учетную запись пользователя пользователя Windows, которая обычно регистрируется на этом терминале
Перезапустить Apache
Я также внесла изменения в пользовательскую информацию в файле httpd.conf, но на самом деле я не уверен, что это необходимо.
Если есть лучшее решение, которое можно объяснить словами двух слогов или меньше, я все уши!