5

問題

shell_execPDFからテキストへのコンバーターを実行するために使用するPHPスクリプトがあります。問題を単純化するために、コマンドshell_execの出力をエコーするだけの短いスクリプトを作成しました。dir

<?php
$cmd = 'C:\\WINDOWS\\system32\\cmd.exe /c ';
echo shell_exec($cmd.' dir');
?>

これを Apache サーバーで実行すると、すべてが期待どおりに機能します。IIS に切り替えると、行が完全にスキップされたかのようです。エラーも出力もログも何もありません。

残念ながら、Active Directory に対してユーザーを認証するので、IIS を使用する必要があります。


これが私がこれまでに試したことです:

  • コマンドをcmd.exe /c直接発行するのではなく、介して発行する
  • 「C:\WINDOWS\system32\cmd.exe」にRead & Execute権限を与えるSERVICE
  • 「C:\WINDOWS\system32\cmd.exe」にRead & Execute権限を与えるNETWORK SERVICE
  • 「C:\WINDOWS\system32\cmd.exe」にRead & Execute権限を与えるIUSR_MACHINENAME
  • Read & Execute「C:\WINDOWS\system32\cmd.exe」に許可を与えEveryoneます (心配しないでください。長い間そのままではありませんでした)。
  • PHP を ASAPI モジュールとして実行する
    • これが私の標準構成です
  • PHP を CGI 拡張として実行する
    • これは機能しません。エラーが発生します。CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers.
  • IIS マネージャーで、Web サイトで に設定Execute Permissionsします。Scripts and Executables
  • html マークアップとその他の php 関数をスクリプトに追加して、それが処理されるかどうかを確認しました。します。まるでshell_execビットがスキップされたかのようです。

この質問を見てくれてありがとう、私は今問題で髪を引っ張っています

乾杯、 イアン


更新 1

私は本当にこれをしたくありませんでしたが、適切な解決策を見つけるまでの一時的なギャップとして、web サーバー (shell_exec が正常に実行されます) で Apache を実行し、cURL 経由で apache スクリプトを呼び出します。それは醜いですが、うまくいきます:)。


更新 2

これは、IIS やアクセス許可自体の問題ではなく、おそらくネットワークに設定されているポリシーの結果であると考え始めていますが、何が原因かはわかりません。フィールドの左からのアイデアはありますか?

4

6 に答える 6

3

以下は、許可を付与する必要があるユーザーを決定するためのより体系的な方法です。

C:\WINDOWS\SYSTEM32 (より一般的には %systemroot%\system32) に次の実行可能ファイルがあることを確認します。

cmd.exe  
whoami.exe  

これらの実行可能ファイルの現在の ACL を確認します

c:\windows\system32> cacls cmd.exe  
c:\windows\system32> cacls whoami.exe  

ユーザー「Everyone」に読み取り (R) アクセス権が付与されていない場合は、次のように一時的に付与します。

c:\windows\system32> cacls cmd.exe /E /G everyone:R  
c:\windows\system32> cacls whoami.exe /E /G everyone:R  

次の内容で whoami.php を作成します。

<?php  
$output = shell_exec("whoami");  
echo "<pre>$output</pre>";  
?>  

whoami.php を Web ブラウザーにロードし、表示されるユーザー名をメモします。

ct29296\iusr_template

上記の手順で追加する必要がある場合は、「全員」の許可を取り消します

c:\windows\system32> cacls cmd.exe /E /R everyone  
c:\windows\system32> cacls whoami.exe /E /R everyone  

手順 5 で見つかったユーザー名のみに読み取り + 実行アクセス許可 (R) を cmd.exe に付与します。

c:\windows\system32> cacls cmd.exe /E /G ct29296\iusr_template:R  

自分のシステムに正しいユーザー名を使用することを忘れないでください。

参照: http://www.myfaqbase.com/index.php?q=php+shell_exec&ul=0&show=f

于 2011-05-23T05:33:09.287 に答える
2

ここにいくつかのポイントがあります:

  • PHPが関数をスキップするshell_execことに関しては、PHPがセーフモードで実行されていないことを確認してください。PHPマニュアルから-shell_exeページ

注:PHPがセーフモードで実行されている場合、この機能は無効になります。

また、これはWindowsでPHPからシェルコマンドを実行する際のよく知られた問題のようです。それを機能させるための最良の方法は、PHPをFastCGIモードで実行することであるというのがコンセンサスのようです(これをすでに試したので、機能させることができなかったと言ったので、私の2番目のポイントです)。このMicrosoftIISフォーラムスレッドが役立つ場合があります。


  • これで、Active Directoryに対して認証するためにWindowsでPHPを実行する必要がある限り、その必要はありません。

Apacheは、 mod_auth_ldapを介してLDAP認証を提供します。また、PHPは、次の機能を通じてLDAPサポートを提供します。

ActiveDirectoryはLDAPの実装です。したがって、任意のLDAPクライアントを使用して、ActiveDirectoryに対して認証を実行できます。

PSApachemod_auth_ldapまたはPHPLDAP関数のいずれかを使用できます。これを機能させるために両方を同時に使用する必要はありません。Apache mod_auth_ldapはHTTPプロトコルレベルで機能しますが、PHP LDAP関数を使用すると、認証および承認プロセスをより詳細に制御できます。

于 2010-03-01T15:06:27.803 に答える
1

いくつかのメモ

.exeを直接実行する場合は、proc_open()を$ other_options = array('bypass_shell' => TRUE)とともに使用できます。

また、procmon.exe(sysinternals)は、このクラスの問題を掘り下げるときの親友です。

于 2010-02-24T09:49:07.240 に答える
0

アプリケーションの実行可能ファイルが存在するディレクトリに、READ & EXECUTE、READ を使用してユーザー NETWORK SERVICE を追加しました。この変更以来、問題はなくなりました。ただし、IUSR_ の READ & EXECUTE、READ 権限を cmd.exe に付与することも必要です。

ここから得た解決策http://forums.iis.net/t/1147892.aspx

于 2011-04-25T09:19:59.217 に答える
0

IIS を実行しているユーザーへのアクセス許可だと思いRead & Executeます (それが IUSR_MACHINENAME でない場合)

于 2010-02-23T04:08:12.300 に答える