ここでの問題は、ほぼ確実にファイルのアクセス許可に関連しています。
コマンドラインから実行する場合php.exe
は、独自のログインユーザーとして実行します。IISからPHPスクリプトを実行すると、httpリクエストに応答して、php.exeが別のユーザーとして実行されます。Windowsのバージョンによっては、
IUSR_machine
-IIS6以前の場合
IUSR
IIS7以降
これらのユーザーは、実行するphpファイルに対する権限が必要です。
それについてもっと読む
IIS7以降ではicacls.exe
、IISとそれが開始するプロセス(php.exeなど)で読み取る必要のあるディレクトリまたはファイルのアクセス許可を設定するために呼び出されるコマンドラインツールを使用します。このセキュリティ関連事項は、PHP、ASPNET、ASP-classic、PythonなどのすべてのIISアプリケーションに適用されます。
IISは、.htm、.js、.css、.jpog、.pngファイルなどの静的ファイルも読み取ることができる必要があります。それらすべてに同じ権限を設定できます:読み取りと実行。
次のように、ユーザーに直接アクセス許可を付与できます。
icacls.exe YOUR-FILE-GOES-HERE /grant "NT AUTHORITY\IUSR:(RX)"
次のように、IUSRが属するグループに権限を付与することもできます。
icacls.exe YOUR-FILE-HERE /grant "BUILTIN\IIS_IUSRS:(RX)"
いずれの場合も、ファイルレベルのアクセス許可を設定した後、IISを停止して再起動する必要がある場合があります。
.phpスクリプトが他のファイルまたはディレクトリを読み書きする場合、同じユーザーがそれらの他のファイルまたはディレクトリを許可する必要があります。ファイルを削除できるようにするために.phpスクリプトが必要な場合は、
icacls.exe YOUR-FILE-HERE /grant "BUILTIN\IIS_IUSRS:(F)"
...ファイルへの完全な権限を付与します。
ディレクトリ全体にアクセス許可を付与することもできます。これにより、将来そのディレクトリに作成されるすべてのファイルが、ディレクトリに設定されたファイル固有のアクセス許可を継承するように指定できます。たとえば、ディレクトリのファイル権限を設定してから、一連のファイルをディレクトリにコピーすると、すべてのファイルが親からアクセス許可を取得します。これは、OIフラグとCIフラグを使用して行います(これらのイニシャルは「object-inherit」と「container-inherit」を表します)。
icacls.exe DIRECTORY /grant "BUILTIN\IIS_IUSRS:(OI)(CI)(RX)"
copy FILE1 DIRECTORY
copy FILE2 DIRECTORY
...
IISで新しいvdirを作成して、PHPスクリプト、ASPX、.JS(はい、ASP Classic)、Pythonなどを実行できるようにする場合は、次の手順を実行します。
appcmd.exe add app /site.name:"Default Web Site" /path:/vdirpath /physicalPath:c:\docroot
icacls.exe DIRECTORY /grant "BUILTIN\IIS_IUSRS:(OI)(CI)(RX)"
次に、ファイルをディレクトリにドロップすると、適切なアクセス許可が取得されます。
ディレクトリにACL(アクセス制御リスト)を設定しても、ディレクトリにすでに存在するファイルのACLは変更されません。すでにディレクトリにあるファイルにアクセス許可を設定する場合は、特定のファイルでicacls.exeを使用する必要があります。icaclsはワイルドカードを受け入れ、再帰する/t
スイッチもあります。