如何让shell_exec在IIS 6.0上运行

时间:2010-02-19 04:17:51

标签: php windows iis shell-exec

问题

我有一个使用shell_exec运行pdf-to-text转换器的PHP脚本。为了简化问题,我创建了一个简短的脚本,使用shell_exec来回显dir命令的输出。

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

当我在Apache服务器上运行它时,一切都按预期工作。当我切换到IIS时,就像完全跳过该行一样:没有错误,没有输出,没有日志,没有任何内容。

不幸的是,我需要使用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权限
  • 在“C:\ WINDOWS \ system32 \ cmd.exe”上向Read & Execute授予Everyone权限(别担心,它不会长久保留,哈哈)
  • 将PHP作为ASAPI模块运行
    • 这是我的标准配置
  • 将PHP作为CGI扩展运行
    • 这不起作用,我收到错误:CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers.
  • 在IIS管理器中,将Execute Permissions设置为您网站上的Scripts and Executables
  • 在脚本中添加了html标记和其他php函数,以查看是否得到了处理;它确实。就好像shell_exec位被跳过一样。

非常感谢你看这个问题,我现在正在解决这个问题

干杯, 伊恩


更新1

我真的不想这样做,但作为一个停止差距,直到我找到一个正确的解决方案,我在Web服务器上运行Apache(运行shell_exec很好),我通过cURL调用我的apache脚本。这很难看,但它有效:)。


更新2

我开始认为这不是IIS或权限本身的问题,但可能是我们网络上的一些政策的结果 - 虽然我无法想象。来自左边的任何想法?

6 个答案:

答案 0 :(得分: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)访问权限,则TEMPORARILY授予如下

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并记下显示的用户名,例如在我的情况下它显示

ct29296 \ iusr_template

如果必须在上述步骤中添加

,则撤销“每个人的”权限
c:\windows\system32> cacls cmd.exe /E /R everyone  
c:\windows\system32> cacls whoami.exe /E /R everyone  

仅使用读取+执行权限(R)到cmd.exe

授予在步骤5中找到的用户名
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

答案 1 :(得分:2)

以下是几点:

  • 关于PHP跳过shell_exec函数,请确保PHP未以安全模式运行。从PHP手册 - shell_exe page
  

注意:当PHP以安全模式运行时,此功能被禁用。

在Windows中从PHP执行shell命令似乎也是一个众所周知的问题。共识似乎是让它运行的最好方法是让PHP在FastCGI模式下运行(我知道你已经尝试过这个并说你无法让它工作 - 因此我的第二点)。您可能会发现此Microsoft IIS Forum thread有用。


  • 现在,只要在Windows上运行PHP以便针对Active Directory进行身份验证 - 您不必!

Apache通过mod_auth_ldap提供LDAP身份验证。 PHP通过以下功能提供LDAP支持:

Active Directory是LDAP的一种实现。因此,您可以使用任何LDAP客户端对Active Directory执行身份验证。

P.S。您可以使用Apache mod_auth_ldap或PHP LDAP函数 - 您不需要同时使用它们来完成这项工作。 Apache mod_auth_ldap在HTTP协议级别工作,而PHP LDAP功能使您可以更好地控制身份验证和授权过程。

答案 2 :(得分:1)

几个笔记

如果你想直接执行.exe,你可以使用proc_open()和$ other_options = array('bypass_shell'=&gt; TRUE)

procmon.exe(sysinternals)在深入研究这类问题时是你最好的朋友

答案 3 :(得分:0)

我对运行IIS的用户说Read & Execute权限(如果那不是IUSR_MACHINENAME)

答案 4 :(得分:0)

  

不幸的是,我需要使用IIS,因为我要根据活动目录验证我的用户。

将您的应用程序基于IIS的前提是有缺陷的。没有什么可以阻止你用Apache做这件事。实际上,您甚至不需要在MS-Windows操作系统上运行它。

请谷歌了解如何设置所有这些。

请注意,对于可能使用NTLM的IIS和本地客户端,安全策略会被抛出窗口。 IIS处理程序线程可以使用NTLM MSIE客户端的凭据运行。或不。调试这些东西会让你发疯!

℃。

答案 5 :(得分:0)

我添加了用户NETWORK SERVICE和READ&amp; EXECUTE,READ到我的应用程序的可执行文件所在的目录。由于这种改变,问题就消失了。 然而,授予权限READ和amp;也是必要的。执行,读取IUSR_到cmd.exe。

我从这里得到的解决方案http://forums.iis.net/t/1147892.aspx