PHP exec () не может получить доступ к сетевому диску - PullRequest
1 голос
/ 15 декабря 2011

В PHP я перечисляю некоторые файлы, вызывая exec("dir ..."). Однако это странно работает только на локальных дисках. На сетевых дисках он имеет ненулевой код состояния результата и результаты не возвращаются.

Я запускаю Apache в Windows XP Professional.

Есть ли хитрость, чтобы это исправить? Или просмотреть сообщение об ошибке?

РЕДАКТИРОВАТЬ: apache работает под тем же пользователем, что и я, и я могу сделать это из командной строки

1 Ответ

4 голосов
/ 15 декабря 2011

Я собирался сказать: «Вы также не можете сделать это из командной строки», и я уверен, что раньше это было правдой, но я только что попробовал на WinXP Pro SP3, и он работает, просто несмотряменя.

Мне нужно было заставить PHP общаться с сетевым диском некоторое время назад (когда я был явно более зеленым в мире PHP), и у меня был кошмар, заставляющий его работать, однако в конце концов мне удалосьзаставить его работать, выполнив следующие действия:

  • В оснастке MMC «Службы» измените учетную запись, под которой работает Apache, на локального пользователя.Вероятно, в данный момент будет установлено значение SYSTEM и (AFAIK) эта учетная запись не имеет доступа к сетевым дискам.После этого вам потребуется перезапустить службу.
  • Добавьте следующую строку, прежде чем пытаться получить к ней доступ: system('net use Z: "\\servername\sharename" PASSWORD /user:USERNAME /persistent:no');, где вы меняете букву диска, UNC-путь, имя пользователя и т. Д. В соответствии с вашими требованиями.Сделайте это, даже если диск уже подключен.Кажется, я помню, что мне пришлось использовать system() вместо exec() или shell_exec(), или это не сработало - в результате вам нужно будет выполнить выход-буфер, чтобы остановить вывод данных в STDOUT.

Понятия не имею, почему это сработало, но это сработало.Обратите внимание, что я пытался использовать диск с собственными функциями PHP, такими как opendir() и fopen(), вместо того, чтобы пытаться exec() использовать внешнюю программу против него.

Если вы хотите просмотретьсообщения об ошибках от вашего звонка до dir, добавьте 2>&1 в конец команды.Это перенаправит STDERR в STDOUT, поэтому вы должны получить сообщения об ошибках в результате exec().

Так ваша строка будет выглядеть так:

exec("dir Z:\\some\\path 2>&1")
...