如何使用php从服务器映射到本地PC上

时间:2011-10-18 00:35:58

标签: php drive-mapping

我正在开发一个项目,使用户能够从网页上启动工具。该页面是使用PHP设计的。我在我的PC上安装了WAMP服务器,我可以单击一个按钮在C驱动器上创建和编写一个新的批处理文件,其中包含要启动的应用程序的路径,当用户在页面上选择它们时,这些应用程序将从数据库中拉出。 现在,当我在PC上的WAMP服务器上执行此操作时,此功能正常。我必须将脚本上传到我工作的服务器,该服务器托管在同一个LAN上。唯一的问题是我似乎无法在用户PC上创建或写入文件。

根据我的理解,它不是映射当前PC的驱动器。这是我在电脑上的表现。

$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 :(得分:0)

我假设您知道您无法从服务器上的PHP脚本实际执行客户端PC上的批处理文件(至少不能单独使用PHP),所以我不会解释这一点。 / p>

我还假设你正在处理所有Windows机器 - 似乎可能来自代码示例和问题的背景。


您在这里寻找的是处理SMB协议的功能。有几种方法可以解决这个问题:

  • 很多时候,你可以简单地使用UNC(就像你上面试图做的那样)。正确的语法是\\servername\sharename\file.ext。我遇到过一些人声称你可以用username:password@作为前缀(并且有一个声称你可以用@username:password加上后缀,这肯定是错的)但是我无法工作。因此,如果您想使用此方法来完成这项工作,我建议您以具有AD权限的用户身份运行PHP,以便在客户端计算机上读取/写入相关共享,因此不需要额外的身份验证。 / p>

  • this class我的意思是尝试一段时间,它为PHP提供了一个smb://流包装器。我对此没有任何经验,但从它的外观来看,您应该能够使用标准的URL语法来访问该文件(即smb://user:pass@/servername/sharename/file.ext)。

  • 您可以映射网络驱动器,以便可以像使用任何其他驱动器号一样使用它。这是我成功用于访问需要PHP身份验证的SMB共享的唯一方法。这种方法有它的缺点,因为它增加了另一层复杂性 - 因为你临时映射一个驱动器号,你可以确保多个并发实例使用不同的驱动器号。

基本程序将是这样的:

// 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");