

IISでPHPを動かし、単純にInput
Type=Fileでフォームを表示し、アップロードされたファイルを別のサーバにコピーしようとしているのですが、多分アクセス権がないからだと思いますがコピーできません。

元々、VBScriptで書かれていたものをPHPで焼き直したものです。  
この話を聞いた1年前に簡易にPHPで書いてApacheで動かしたときは、問題なく動いたのですが、今回導入しようとしているIIS環境で動かそうとしたところ、動かなくて困っています。

ご助言よろしくお願いします。

**プログラム抜粋**

**PHP**

[code]

    // アップロード先をネットワークドライブとしてマウント
      exec('net use X: "\\\\\\\xxx.xxx.xxx.xxx\\\temp" password /user:user /persistent:no');
    
[/code]

**HTML**

[code]

    <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST" enctype="multipart/form-data">
                  <input type="file" name="file">
                  <input type="submit" value="送信">
    </form>
    
[/code]

**PHP**

[code]

    $file=isset($_FILES['file'])?$_FILES['file']:null;
    if(is_null($file)){
                  print "ファイルを選択してください";
                  exit;
    };
      
    if($file["error"]!==0){
                  print "転送に失敗しました";
                  exit;
    };
     
    $filename = "X:/" . $file['name']; // アップロードファイルを格納するファイルパスを指定
    
    if(!move_uploaded_file($file['tmp_name'],$filename)){
                  print "アップロード失敗";            
                  exec('net use X: /delete');            // ドライブのアンマウント
                  exit;
    }else{
                  print "アップロード完了<br>\n";
                  exec('net use X: /delete');            // ドライブのアンマウント
                  exit;
    }
    
[/code]

ところどころ抜粋加工していますが、要は事前にコピー先をマウントしておいて、アップロードされたファイルをコピーし、マウントを解除しています。

1年前にApacheで作成したときは動いたのですが、現環境ではまず（1）ファイルのマウントができなくなっており、（2）事前にマウントしておいてもコピーの段階でディレクトリが見つからないと言われます。

プログラムを実行しているユーザが匿名ユーザで権限がないからだとは思うのですが、どのように権限を与えればいいのかわかりません。

とりあえず、意味があるかどうかはわからないのですが試したのは以下の内容です。

  1. アプリケーションプールでユーザプロファイルの読み込みをTrueに変更
  2. c:¥windows¥tempなど、ローカルサイドにアプリケーションプールIDおよびISUR等に権限を追加
  3. 送信先のディレクトリの権限をEveryoneフルコントロールに変更  
ー 別サーバからアクセスするとユーザID・パスワードを聞かれるのでEveryone自体が効いていない

  4. 仮想ディレクトリにアップロード先を指定したが、webからだとディレクトリは見つからないと言われた
  5. web.configに以下を追加したが、改善しなかった。  
identity impersonate="true" userName="Administrator" password="password"

  6. 問題が起きる（1）（2）を切り離して、実行してみても、以下の通りうまくいかない。  
（1）の引数を２つセットした戻り値は、Array()と2  
（2）事前にアップロード先をマウントして、中のファイルをfile_existsしても、ディレクトリが見つからないという

  7. 6の内容をPHPから実行すると問題なく実行できる。
  8. webから呼び出すと、w3wp.exeが起動するがこのユーザがアプリケーションプール名になっており、これに権限がないからだと思うのですが、どうすればローカルの資格を与えられるのかわかりません。

IIS自体あまり触ったことがなく、初歩的な見落としがあるかもしれませんので、お気づきのことがあればご指摘ください。

環境は以下の通りです。

アプリ側  
Windows Server 2012 R2  
IIS v6.2 ビルド9200  
PHP v7.4.6

書き込み先  
Windows Server 2003 R2

それぞれのサーバはドメインに参加しておらず、ワークグループで動いています。  
同じドメインに参加していれば、アプリケーションIDを共有してなんとかなるかもしれないのですが...

**php.ini 6/17追記**

[code]

    error_log = C:\php\log\php_errors.log
    post_max_size = 8M
    default_charset = "shift_jis"
    cgi.force_redirect = 0
    cgi.fix_pathinfo=1
    fastcgi.impersonate = 1
    fastcgi.logging = 0
    upload_max_filesize = 8M
    date.timezone = Asia/Tokyo
    
    
[/code]

よろしくお願いします。


CC BY-SA 4.0
2020-06-15T10:18:59.647
67684
2020-06-17T08:40:01.140
2020-06-17T08:40:01.140
40603
40603
question
php iis
IIS上のPHPで別サーバにファイルを書き込みたい