1

この質問は、私が書いた別の質問に関連しています。

PHPのDOTNETを使用する際の問題。

DOTNET()PHPの関数を使用して、作成したDLLを呼び出していたところ。

コマンドラインから実行することで、正常に動作させることができましたphp.exe example.php(DLLはまだPHPフォルダーにあります)。

phpファイルを同じマシン上のIIS7Webサーバーフォルダーに移動しました(DLLを同じphpフォルダーに残します)が、500の内部サービスエラーが発生し続けます。

サーバーログ(inc:\inetput\logs\およびin c:\windows\temp\php53errors)を確認しましたが、エラーの原因に関する関連情報がないようです。エラーフィードバックを増やすために設定を変更しようとしましphp.iniたが、それは役に立たないようです。

私はこの問題が以下に関連している可能性があると推測することしかできません。

  1. そのphpファイルに適切な権限がありません(私のdllはファイルの読み取り/書き込みを行います)
  2. phpはDLLを見つけることができません

私が得る実際のエラーは次のとおりです。

FastCGIプロセスが予期せず終了しました。

この問題をデバッグする方法について何かアイデアはありますか?

4

1 に答える 1

1

ここでの問題は、ほぼ確実にファイルのアクセス許可に関連しています。

コマンドラインから実行する場合php.exeは、独自のログインユーザーとして実行します。IISからPHPスクリプトを実行すると、httpリクエストに応答して、php.exeが別のユーザーとして実行されます。Windowsのバージョンによっては、

  • IUSR_machine-IIS6以前の場合
  • IUSRIIS7以降

これらのユーザーは、実行する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スイッチもあります。

于 2012-06-08T03:26:14.240 に答える