0

我正在开发一个项目,该项目将使用户能够从网页启动工具。该页面是使用 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 站点的文件

4

1 回答 1

0

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

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


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

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

  • 我一直想尝试这个类smb://,它为 PHP 提供了一个流包装器。我对此没有任何经验,但从外观上看,您应该能够使用标准的 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");
于 2011-10-18T02:05:06.490 回答