【问题标题】:how to map on a local pc from a server using php如何使用php从服务器映射到本地PC
【发布时间】:2011-12-09 17:09:13
【问题描述】:

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

据我了解,它并未映射当前 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 站点的文件

【问题讨论】:

  • PHP 是服务器端,所以您在 PHP 中所做的任何事情都会发生在服务器上。您无法使用它在客户端 PC 上启动文件。查看 Javascript 或桌面应用程序。
  • 真正想做什么?不管它是什么,它似乎都不适合客户端(Web)服务器应用程序。
  • 这是它应该的工作方式,并且在 wamp 服务器上工作。用户在线登录到他/她的帐户 --> 从要启动的应用程序列表中选择 --> 数据库更新请求并在 F 驱动器(与服务器位于同一域)上写入文件应用程序的路径要启动-> 之后您所要做的就是单击启动并启动批处理文件。问题再次是当我在我的计算机上执行此操作时它可以工作,但是一旦在实际的主机服务器上它似乎并没有写入文件。我知道 php 只是服务器端,只是想知道它为什么在 wamp 上工作?
  • @Michael “驱动器 F:”总是从运行服务器的机器上看到。它在本地工作,因为 PHP 在同一台物理机器上运行并且可以访问整个系统(只要权限允许 yadayada)。如果您想访问另一台机器,您将受到与其他任何东西相同的网络限制/允许/可能性。如果您无法访问目标计算机上的共享,则不能。特别是 SMB 对 PHP 来说很棘手。为什么不能简单地提供文件供下载
  • @deceze 真的。我只是在想,因为主机服务器和客户端机器在同一个局域网上,我仍然可以通过调用它来访问 F 驱动器 \\servername\sharename\userId\\finename。如果这不起作用,我将不得不像你说的那样编写文件并下载它。我只是希望避免每次用户进行更改时都必须下载文件,也不是每个用户都知道他们将文件保存在哪里以及如何运行批处理文件。具有讽刺意味的是,我在一个为互联网提供技术支持的呼叫中心工作。谢谢

标签: php drive-mapping


【解决方案1】:

我假设您知道您实际上无法通过服务器上的 PHP 脚本在客户端 PC 上执行批处理文件(至少,不能单独使用 PHP),所以我不会对此进行解释。

我还假设您正在处理所有 Windows 机器 - 从代码示例和问题的上下文中看起来很可能。


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多