2016-12-27 38 views
0

IISのWindows Server 2012 R2で動作するPHPスクリプトを使用しているサイトがあります。私はネットワーク上の別のサーバ上のファイルを読むためにfopenを使用しようとしていますが、問題があります。 fopenコマンドを使用してローカルサーバー上のファイルを開き、PHP CLIを使用して、リモートサーバー上のファイルを正常に開くことができます。私は私のブラウザを使用してサイトを経由して、それを処理しようとすると、PHPはネットワークファイルを開くことができません

しかし、それはエラーで失敗する:IISで

"failed to open stream: Permission denied"

、私は新しいアプリケーションプールを作成し、ドメイン管理者としてのアイデンティティーを設定しています両方のサーバーへの管理者アクセス権がありますが、これは役に立たないようです。これは、CLIが動作したときにCLIを実行したアカウントと同じです。私は(あまりにものをエスケープして)バックスラッシュを使用してみました

fopen("//remoteservername/c$/inetpub/wwwroot/test.html", "w") or die("Can't open file!"); 

はここで私が使用している私のPHPスクリプトコードです。 FILE://を先に使ってみました。リモートサーバーのドライブをPHPを実行するWebサーバーにマッピングし、Y:\ inetpub ...のようなパスを使用してみました。Windowsサーバーであるため、 "w"の代わりに "rb"を使用しようとしました。

サイトが実行されているアカウント/アイデンティティと関係がありますが、私が変更した後もまだそれがなぜ機能しないのか分かりません。

UPDATE:私は、同じファイルを開くしようとした場合、私はfopenの作品がローカルサーバー上のファイルを読み込むことを述べたが、私は以下のように相対パスを使用する場合には、唯一の真のだそうです...

fopen("test.html", "w") or die("Can't open file!"); 

以下のような絶対パスを使用してローカルサーバに接続すると失敗します。だから私は...それはアイデンティティの問題だともう

fopen("//localservername/c$/inetpub/wwwroot/test.html", "w") or die("Can't open file!"); 

UPDATE確信していない。だから私は両方のCLIでとブラウザを経由して(「whoamiを」)はshell_exec走りました。 CLIでそれを実行すると、シェルを実行しているドメインアカウントが表示されます。しかし、ブラウザでスクリプトを実行すると、 "nt authority \ iusr"と表示されます。他のユーザーの下で実行する方法を知りたいIIS内のアプリケーションプールIDを変更しても、テストで知ることのできるものとは違いはありません。

echo shell_exec("whoami"); 
+0

もしも助けがあれば、ずっと前にPHP/IISやネットワークドライブと戦いました。サイトの管理者/開発者は、異なるユーザーによって報告された矛盾した動作を見ていました。これは、認証にNTLMを使用するイントラネットアプリケーションでした。その動作を説明するために唯一の合理的な説明がありましたが、PHPコードはNTLM(erk!)経由で提供されているアクセス許可で実行されていました。我々はこれを完全には検証しなかった。 – symcbean

答えて

2

OK良いはずです。IIS> FastCGI設定> PHPアプリケーションを選択>右側のサイドバーで[編集]をクリックし、[詳細設定]メニューから[プロトコルをNamedPipeからTcpに変更]をクリックします。

私はこの出くわした方法は、私たちはPHPを実行しているし、それがアプリケーションプールに設定された正しいアカウント/ IDを使用していた別のWindows Server上でテストをしたでした。だから私はテストするために私のサーバー上の新しいサイトをセットアップし、私も実行することができませんでした echo shell_exec( "whoami"); http://tech.trailmax.info/2012/12/php-warning-shell_exec-unable-to-execute-on-iis-7/

私はshell_execを実行できない問題を解決しただけでなく、設定したドメインアカウントを使用してPHPスクリプトを実行し始めました。 IIS AppPool。今私のfopenは期待どおりに動作します。

+1

うわー、これはちょうど私が大きな時間を助けたと思う。私はUNCシェアのファイルマネージャーとして機能するWebアプリケーションで数日間苦労してきました。私がIIS匿名アクセスを行っていれば、それは完璧に機能しましたが、どうして誰が何をしたのかを記録するために、ユーザーのネットワークユーザー名を悩ます必要がありました。だから、私は匿名をオフにしましたが、Windows認証を有効にしました。また、UNC共有上に新しいファイルを作成しようとするとfopenが失敗することがありました。しかし、この小さなトリックを実行することはそれを修正したようです。ありがとうございました !! – DaveyBoy

0

php manualあなたは\\ localservername \ C $ \のinetpub \ wwwrootの\

test.htmlというしかし、\、それはあなたが数を倍増する必要があり、エスケープ、他の特殊文字の予約文字だとして使用する必要があります言うようにこのような\の:

fopen("\\\\localservername\\c$\\inetpub\\wwwroot\\test.html", "w") or die("Can't open file!"); 

それはPHPスクリプトを実行しているWebサーバのユーザーがそのリソースにアクセスするために必要なアクセス許可を持っているかどうかをチェックする必要があり動作しない場合。

通常、管理共有(ドライブ+ $)は管理者のみに許可されます。

私見(Cの$)の代わりに管理共有を使用してのウェブサーバユーザの権限で共有フォルダを作成するために、私はこれが解決取得することができた

+0

あなたの例のような余分なものを含めて私の元の投稿でバックスラッシュを試してみることに言及しました。 whoamiとget_current_user()の両方を使用して現在のユーザーをチェックし、ドメインアカウントをIDとして持つアプリケーションプールを使用しているIISサイトを持っていても、 "NT Authority \ IUSR"で実行されていることを示します。私はこれが問題だと思いますが、それをどう修正するかはわかりません。私はIUSRにtest.htmlファイルへのフルアクセスを与えようとしましたが、変更はありませんでした。私は管理共有を使っていますが、提案したようにサーバー上に共有を作成してテストしましたが、変更はまだありません。他のアイデア?ありがとうございます – Sina

+0

ここにPHPのエラーログが表示されます。最初の例は、C $管理共有を使用してアクセスしようとしています。 2番目の例では、作成してアクセス許可を割り当てた "test"という名前の共有フォルダを使用しています。 [12月28日 - 2016午前8時14分00秒アメリカ/ Los_Angeles] PHPの警告:関数fopen(\\ localservername \ C $ \のinetpub \ wwwrootの\ test.htmlという):ストリームをオープンに失敗しました:許可がCに拒否:\のinetpub \ wwwrootの\ test.phpをはライン上で100は [12月28日 - 2016年8時15分09秒アメリカ/ Los_Angeles] PHPの警告:関数fopen(\\ localservername \テスト\のtest.htmlという)は:​​ストリームをオープンに失敗しました:で拒否されたアクセス権をC:\ inetpub \ wwwroot \ test.php on line 100 – Sina

+0

明らかに、アクセス許可には問題があります。あなたはテストのためだけに共有の「すべての」ユーザーに完全なアクセス許可を追加しようとしましたか?また、NT Authority \ IUSRはIISマシンでしか動作しないローカルユーザーだと思います。これはドメインユーザーではないため、他のマシンにアクセス権がありません。プールを編集して、非ローカルアカウントを使用して、2台目のマシンにアクセス許可を追加する必要があります。 – NetVicious

関連する問題