質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Active Directory

Active Directoryは、 Windows Serverの機能の一つで、 マイクロソフトによって作られたディレクトリサービスです。 ネットワーク上に存在する様々なハードや利用者情報のアクセス権限などを一元管理が出来ます。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

Q&A

解決済

1回答

1915閲覧

別サーバーへのファイルアップロードができない

hatsuzo

総合スコア56

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Active Directory

Active Directoryは、 Windows Serverの機能の一つで、 マイクロソフトによって作られたディレクトリサービスです。 ネットワーク上に存在する様々なハードや利用者情報のアクセス権限などを一元管理が出来ます。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

0グッド

1クリップ

投稿2023/01/07 00:42

編集2023/01/07 03:38

いつもお世話になっております。
Permissionのことがよく理解できていないので、よろしくお願いします。

実現したいこと

PHPスクリプトで、ファイルを選択して同一ドメイン上にあるファイルサーバーにアップロードする処理です。

実行環境

Webサーバー
・Windows2012
・IIS8
・PHP5.4
ファイルサーバー(アップロード先)
・Windows2019
両者は同一ドメイン上にあります。

発生している問題・エラーメッセージ

アップロード先が同一サーバーでは問題なく動くのですが、同一ドメイン上にある別のファイルサーバー(IIS無し)だと動作しません。
failed to open stream: Permission denied

該当のソースコード

PHP

1<html lang="ja"> 2<head> 3<meta charset="utf-8"> 4</head> 5<body> 6<h1>アップロード処理のサンプル</h1> 7<form enctype="multipart/form-data" method="post"> 8<input type="hidden" name="MAX_FILE_SIZE" value="1000000"> 9<input name="file" type="file"> 10<input type="submit" name="_upload" value="アップロード"> 11</form> 12<?php 13//[アップロード]ボタンの押下確認 14if (isset($_POST['_upload'])) { 15 $filename = './'.$_FILES['file']['name']; // カレントディレクトリ OK 16 //ファイルをテンポラリから保存場所へ移動(但し本来は渡されたファイル名をそのまま使うのは危険) 17 $filename = '\\\hogehoge\\doc\\'.$_FILES['file']['name']; // サーバー名 NG 18// $filename = '\\\192.168.1.111\\doc\\'.$_FILES['file']['name']; // IPアドレス NG 19 print $filename; 20 if (move_uploaded_file($_FILES['file']['tmp_name'], $filename)) { 21 echo $_FILES['file']['name'].'をアップロードしました'; 22 } else { 23 //エラー処理 24 } 25} 26?> 27</body> 28</html>

試したこと

▽アップロード先が同一サーバー
・アップロード先のフォルダに対し、IUSRへの「書き込み権限」付与 → 正常に動作。

▽アップロード先が別サーバー(IISの動いていないファイルサーバ)
・アップロード先のフォルダに対し、IUSRへの「書き込み権限」付与 → 同じエラー。
・アップロード先のフォルダに対し、everyoneへの「書込み権限」付与 → 同じエラー。
・アップロード先のフォルダに対し、hogehoge$への「書込み権限」付与 → 同じエラー。
・アップロード先のフォルダに対し、IUSR_WPGへの「書込み権限」付与 → 同じエラー。
・アップロード先のフォルダに対し、IIS_IUSRSへの「書き込み権限」付与 → 同じエラー。

▽パスの記述変更
・$filename = './192.168.1.111/edoc/'.$_FILES['file']['name']; に変更
→ failed to open stream: No such file or directory のエラー。

▽ファイルサーバー側のローカルセキュリティポリシー変更
・セキュリティオプションで下記の項目を変更
ネットワークアクセス:Everyoneのアクセス許可を匿名ユーザーに適応する:有効
ネットワークアクセス:匿名でアクセスできる共有:フォルダ名(doc)を入力
ネットワークアクセス:ローカルアカウントの共有とセキュリティモデル」:Guestのみ
→ 同じエラー

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2023/01/07 01:43

ドメイン同じでもWebサーバは別になるのでポートも変える必要があるのでは? 設定含めて詳細確認してください
退会済みユーザー

退会済みユーザー

2023/01/07 01:48

たぶんポートは関係なくて、単に Web サーバー(IIS)⇒ ファイルサーバーへのアクセス権の問題でしょう。上の私の質問に返事がないのでイマイチ確信が持てませんが・・・
hatsuzo

2023/01/07 02:04

SurferOnWww さん コメントありがとうございます。 > IUSRS とは何でしょう? IUSR, IIS_IUSRS なら組み込みでありますが、IIS_IUSRS の間違いですか? IUSR の間違いです。失礼しました。 それから、ローカルのIIS_IUSRS は無いので、IIS_WPG にも 書込み権限を付けてみましたが同じでした。 m.ts10806 さん コメントありがとうございます。 > ドメイン同じでもWebサーバは別になるのでポートも変える必要があるのでは? ポートというのは意識していませんでした。 どの部分の設定のことなのでしょうか?
m.ts10806

2023/01/07 02:22

ファイルサーバもftpポートを開放してたりとかしてませんか?
m.ts10806

2023/01/07 02:23

失礼。Webサーバを2つ立ててるわけではないんですね。ファイルサーバのほうか。 SurferOnWwwさんの仰るとおりですね
hatsuzo

2023/01/07 02:28

m.ts10806 さん コメントありがとうございます。 そうです。アップロード先のほうは単なるファイルサーバでIISは起動していません。
退会済みユーザー

退会済みユーザー

2023/01/07 02:47

> IUSR の間違いです。失礼しました。 質問欄を編集して書き直してください。 ただ、IIS_IUSRS でないというのが解せません(ASP.NET の場合は IUSR ではダメなので)。IUSR に間違いなくてかつ IIS_IUSRS には何も権限を与えてないのでしょうか? 書き直す前に今一度確認願います。
hatsuzo

2023/01/07 03:01

コメントありがとうございます。 IUSRで間違いなく、IIS_IUSRSが参照できないので追加しておらず、 IIS_WPGを後から追加しています。
退会済みユーザー

退会済みユーザー

2023/01/07 03:14

> ・アップロード先のフォルダに対し、IUSRSへの「書き込み権限」付与 → 正常に動作。 上のところが直ってませんが、直し忘れですか? > IUSRで間違いなく、IIS_IUSRSが参照できないので追加しておらず、 IIS_WPGを後から追加しています。 そこが解せません。Windows Server 2012 で IIS8 が動くようになっているのなら「IIS_IUSRSが参照できない」ということはなく、さらに IIS_WPG というグループは存在しないはずなのですが・・・
hatsuzo

2023/01/07 03:41

コメントありがとうございます。 IIS_IUSRSは参照できました。アップロード先サーバーのローカルアカウントですね。 追加しましたが結果は改善されませんでした。 でもドメインの匿名アカウントIIS_WEGは参照できています。
hatsuzo

2023/01/07 03:45

IIS_WPGの誤りですね。失礼しました。
guest

回答1

0

ベストアンサー

IIS_IUSRSは参照できました。アップロード先サーバーのローカルアカウントですね。
でもドメインの匿名アカウントIIS_WEGは参照できています。IIS_WPGの誤りですね。

Web サーバー(IIS を動かしている方)で IIS_IUSRS に権限を与えてないのに動いたとか、IIS_WPG が存在するというのが解せませんが、そこはちょっと置いといて・・・

Web サーバーもファイルサーバーも Active Directory ドメイン環境に属しているようですので、以下の記事の「ネットワークへのアクセス」のセクションに書いてあるように、ファイルサーバーで <domainname>\<machinename>$ にアップロード先のフォルダに対し書き込み権限を与えて試してみてはいかがですか。

アプリケーション プール ID
https://learn.microsoft.com/ja-jp/previous-versions/ee886292(v=technet.10)

記事には "NETWORKSERVICE で実行されるワーカー プロセスはコンピューター アカウントとしてネットワークにアクセスします。" と書いてありますが、NETWORKSERVICE でなくても IIS8 のワーカープロセスのアカウント「アプリケーションプール ID」でもそれは有効です。

ただ、IIS_IUSRS に権限を与えてないのに動いたとか、さらに IIS_WPG というグループが存在するという、質問者さん独自の環境の違いとかがあると分かりませんが。

質問に対するコメント欄でも紹介しましたが、以下のドキュメントを読んでください。

IIS 7.0 での組み込みユーザーとグループ アカウントとは
https://learn.microsoft.com/ja-jp/previous-versions/dd939094(v=technet.10)?redirectedfrom=MSDN

"IIS_IUSRS 組み込みグループが IIS_WPG グループに取って代わりました" ということで、IIS7 以降であれば IIS_WPG というグループは存在しないはずです。

ちなみに自分の開発環境の Windows 10 + IIS10 では以下のようになっています。

イメージ説明

投稿2023/01/07 04:12

編集2023/01/07 04:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2023/01/07 06:17

ご回答ありがとうございます。 <domainname>\<machinename>$  は、「試してみたこと」に書きました通り、すでに行っていますが改善はされていません。 ちなみに、この<machinename>は、アクセスするWebサーバー側なのかアップロードするファイルサーバー側なのでしょうか? 両方ためしてみましたが、結果は同じでした。 画面ショットが収まりきらないので、ACLを書くと、 Everyone                書込み可 IUSR                  書込み可 IIS_WPG(ドメイン名\IIS_WPG)     書込み可 マシン名$(ドメイン名\マシン名)     書込み可 IIS_IUSRS(マシン名\IIS_IUSRS)     書込み可 Administrator              フルコントロール Administrators(マシン名\Administrators) フルコントロール 特定ユーザー               フルコントロール になります。 ご指摘のページも見て、確かにIIS7.0以降はそう書いてあるのですが、うまくいかないので試しに追加してみました。
退会済みユーザー

退会済みユーザー

2023/01/07 07:32

> <domainname>\<machinename>$  は、「試してみたこと」に書きました通り、すでに行っていますが いや、どこにも書いてないようですけど。思い違いをしてませんか? > この<machinename>は、アクセスするWebサーバー側なのかアップロードするファイルサーバー側なのでしょうか? Web サーバーです。 今思い出しましたがあなたは過去に以下のスレッドで同じような話をしてますよね。解決したのではないのですか? httpを使わずWindowsサーバーにファイル転送を行いたい https://teratail.com/questions/9e7yzyb3pxk808
退会済みユーザー

退会済みユーザー

2023/01/07 07:37

前のスレッド https://teratail.com/questions/9e7yzyb3pxk808 では、 > 格納先のフォルダに対しては、IUSRとIIS_IUSRSのアクセス権を付けてあり、この状態でアップロードとダウンロードができています。 と書いてあるのに、今回の話では、 > IIS_IUSRSが参照できないので追加しておらず、 IIS_WPGを後から追加しています。 と話が違っていますが、どういうことですか?
hatsuzo

2023/01/07 08:39

コメントありがとうございます。 >・アップロード先のフォルダに対し、hogehoge$への「書込み権限」付与 → 同じエラー。 言い訳になりますが、hogehoge$ がWebサーバーのことです。説明不足で失礼しました。 過去レスでは確かに同様の質問をしていますが、IIS_IUSRSとIUSRのアクセス権を付けているのは、Webサーバー内のフォルダのことです。 別サーバーに送るところまでは、時間が取れず、検証をするに至っていませんでしたが、一般論として出来るという話を伺ったので一旦クローズさせて頂きました。 気分を害されたようでしたらご容赦下さい。
退会済みユーザー

退会済みユーザー

2023/01/08 01:18 編集

アクセス権の話がよくわかってなさそうですが・・・ 質問のコードの、 > move_uploaded_file($_FILES['file']['tmp_name'], $filename) で failed to open stream: Permission denied となったのだと思いますが、ということは move_uploaded_file を動かしているプロセスのアカウントにファールサーバーのフォルダに対する必要なアクセス権を与える必要があるということのはずです。そこのところは理解されてますか? 上の回答の <domainname>\<machinename>$ に権限を与えるというのは、move_uploaded_file を動かしているプロセスのアカウントが Web サーバーの IIS8 のワーカープロセスのアカウント「アプリケーションプール ID」であるというのが前提です。紹介した記事に書いてある "NETWORKSERVICE で実行されるワーカー プロセスはコンピューター アカウントとしてネットワークにアクセスします。" というのはワーカープロセスはネットワーククレデンシャルを持つのでそういうことが有効ということです。 質問者さんの環境で move_uploaded_file を動かしているのは IIS8 のワーカープロセスではないということですと話が違ってきます。そこを調べてください。
hatsuzo

2023/01/10 04:15

日曜にも関わらず、コメント頂きまして有難うございます。 正直なところ、よく判っていないです。 何度も紹介して頂いた記事を見ましたが、知識不足のため理解に苦しんでいます。 NETWORK SERVISE、アプリケーションプール、匿名アカウント(IUSR等)、この3つが頭の中でごちゃごちゃになっているようです。 IIS8ではアプリケーションプールでの管理を推奨?しているようですので、ご指摘のアプリケーションプールを調べてみました。 Webサーバー上で呼び出し元のサイトはDefaultSiteに含まれており、アプリケーションプールIDはApplicationPoolIdentity、そのアカウントもDefaultAppPoolというデフォルト設定です。 これが仰るところのワーカープロセスということかなと思い、参照したいサーバーのフォルダにIIS AppPool\DefaultAppPool のアクセス権を付けようとしましたが、参照できない状態です。 理解が間違っておりましたらご指摘頂けると幸いです。
退会済みユーザー

退会済みユーザー

2023/01/10 06:48 編集

> 参照したいサーバーのフォルダにIIS AppPool\DefaultAppPool のアクセス権を付けようとしましたが、参照できない状態です。 「参照したいサーバー」というのはファイルサーバーのことだと理解してますが、IIS AppPool\DefaultAppPool というのは Web サーバー内だけで有効なアカウントなので、そんなことはできません。 先に書きましたが、まず、move_uploaded_file を動かしているプロセスのアカウントが何かを質問者さんに調べていただく必要があると思います。(ネットの記事を見ましたが、IUSR という話、IIS_IUSRS という話、IUSR と IIS_IUSRS 両方必要という話もあるようで、一体何がホントか自分には分かりません) それを調べていただいたうえで、それがアプリケーションプール ID アカウントであれば、Web サーバー内にファイルを書き込む場合は IIS_IUSRS(アプリケーションプール ID アカウントが属するグループ)にアクセス権を与える、ファイルサーバーにファイルを書き込むのであれば <domainname>\<machinename>$ にアクセス権を与えるという話になるはずです。 それが IUSR とか、その他ネットワーククレデンシャルを持たないアカウントだとすると自分としてはお手上げです。
hatsuzo

2023/01/10 10:11

SurferOnWwwさん 何度もコメント頂きまして有難うございます。 動かしているプロセスのアカウントの調べ方が分からなかったのですが、動かしているphpのスクリプトに > $user = exec('whoami'); > $group = exec('groups ' .$user); > echo "ユーザー:{$user}<br>"; > echo "グループ:{$group}<br>"; と入れて実行してみたところ、 > ユーザー:nt authority\iusr > グループ: と出てきました。 IUSRなのですが、IUSRは書込み権限が付けてあります。 なんとも判らない状態は変わりませんが、別の方法を考えてみたいと思います。 curlというのを見つけましたが、httpで送るようなので、同じ問題で行き詰りそうです。 サーバーを立ち上げる必要がありますが、ftpで送るのが無難な方法なのかもしれません。
hatsuzo

2023/01/11 00:56

SurferOnWwwさん、貴重な情報を頂きまして有難うございました。 一旦クローズさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問