0

ユーザーが Web ページからツールを起動できるようにするプロジェクトに取り組んでいます。ページは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@(そして、接尾辞を付けることができるという1つの主張は@username:password、間違いなく間違っているに違いありません)が、どちらも機能しません。したがって、この方法を使用してジョブを実行する場合は、AD でクライアント マシン上の関連する共有を読み取り/書き込みする権限を持つユーザーとして PHP を実行することをお勧めします。これにより、追加の認証は必要ありません。

  • 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");
于 2011-10-18T02:05:06.490 に答える