Как отобразить на локальном ПК с сервера с помощью PHP - PullRequest
0 голосов
/ 18 октября 2011

Я работаю над проектом, который позволит пользователю запускать инструменты с веб-страницы.страница разработана с использованием php.У меня на компьютере установлен WAMP-сервер, и я могу нажать кнопку, чтобы создать и записать новый командный файл на диске C с указанием пути запуска приложений, которые извлекаются из базы данных, когда пользователь выбирает их на странице.Теперь это работает, когда я делаю это на сервере WAMP на моем ПК.Я должен загрузить скрипт на сервер на моей работе, который находится в той же локальной сети.Единственная проблема заключается в том, что я не могу создать или записать файл на ПК пользователя.

Насколько я понимаю, это не отображение диска для текущего ПК.Вот как я это сделал, когда это было на моем компьютере.

$file_path="C\\test.bat"
function runApp($file_path, $appPath){
  $bat_file = fopen($file_path, "w");
  fwrite($bat_file, "start  ".$appPath."  \n");
  fwrite($bat_file, "echo exit  \n");
  fclose($bat_file); //close file after updating batch file
}

, чтобы заставить его работать с сервера на работе, я попытался

$ip=$_SERVER['REMOTE_ADDR'];
$file_path="user:pass@".$ip."\\F:\\test.bat";

, но он все еще не работает.Что мне не хватает?Любая помощь будет принята с благодарностью

или, пожалуйста, дайте мне знать, если есть какой-либо другой способ, которым я мог бы запустить командный файл или любой файл с php сайта

1 Ответ

0 голосов
/ 18 октября 2011

Я предполагаю, что вы знаете, что на самом деле вы не можете выполнить командный файл на клиентском ПК из сценария PHP на сервере (по крайней мере, не только с помощью PHP), поэтому я не буду объяснять это.

Я также предполагаю, что вы имеете дело со всеми компьютерами Windows - как кажется из примеров кода и контекста вопроса.


Здесь вы ищете функции для обработки протокола SMB . Есть несколько способов справиться с этим:

  • Большую часть времени вы можете просто использовать UNC (как вы пытаетесь сделать выше). Правильный синтаксис для этого будет \\servername\sharename\file.ext. Я сталкивался с людьми, утверждающими, что вы можете добавить к этому префикс username:password@ (и одно утверждение, что вы можете добавить суффикс к @username:password, что, безусловно, должно быть неверно), но я не могу заставить их работать. Поэтому, если вы хотите использовать этот метод для выполнения работы, я бы порекомендовал вам запускать PHP как пользователь, у которого есть разрешения в AD для чтения / записи соответствующего общего ресурса на клиентском компьютере, поэтому дополнительная аутентификация не потребуется.

  • Существует этот класс Я давно хотел попробовать, который предоставляет smb:// потоковую оболочку для PHP. Я не имею никакого опыта в этом, но, судя по всему, вы сможете использовать стандартный синтаксис URL для доступа к файлу (т.е. smb://user:pass@/servername/sharename/file.ext).

  • Вы можете сопоставить сетевой диск так, чтобы он был доступен для использования как любая другая буква диска. Это единственный метод, который я когда-либо успешно использовал для доступа к общему ресурсу SMB, который требует аутентификации из PHP. У этого метода есть свои недостатки, поскольку он добавляет еще один уровень сложности - поскольку вы временно отображаете букву диска, вы гарантируете, что несколько одновременных экземпляров используют разные буквы диска.

Основная процедура будет выглядеть примерно так:

// Set the parameters
$serverNameOrIp = $_SERVER['REMOTE_ADDR'];
$shareName = 'f';
$fileName = 'test.bat';
$userName = 'Dave';
$password = 'Random';
$driveLetter = 'Z'; // You have to make sure there are no clashes with this!

// Map the drive
exec("net use {$driveLetter}: \\\\{$serverNameOrIp}\\{$shareName} {$password} /user:{$userName} /persistent:no");

// Do your thang... for example
file_put_contents("{$driveLetter}:\\$fileName",$batchFileData);

// Un-map the drive to avoid conflicts with later instances
exec("net use {$driveLetter}: \\\\{$serverNameOrIp}\\{$shareName} /delete");
...