问题
我有一个使用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
发出命令,而不是直接发出Read & Execute
授予SERVICE
权限
Read & Execute
授予NETWORK SERVICE
权限
Read & Execute
授予IUSR_MACHINENAME
权限
Read & Execute
授予Everyone
权限(别担心,它不会长久保留,哈哈)CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers.
Execute Permissions
设置为您网站上的Scripts and Executables
shell_exec
位被跳过一样。非常感谢你看这个问题,我现在正在解决这个问题
干杯, 伊恩
更新1
我真的不想这样做,但作为一个停止差距,直到我找到一个正确的解决方案,我在Web服务器上运行Apache(运行shell_exec很好),我通过cURL调用我的apache脚本。这很难看,但它有效:)。
更新2
我开始认为这不是IIS或权限本身的问题,但可能是我们网络上的一些政策的结果 - 虽然我无法想象。来自左边的任何想法?
答案 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)
以下是几点:
shell_exec
函数,请确保PHP未以安全模式运行。从PHP手册 - shell_exe page:注意:当PHP以安全模式运行时,此功能被禁用。
在Windows中从PHP执行shell命令似乎也是一个众所周知的问题。共识似乎是让它运行的最好方法是让PHP在FastCGI模式下运行(我知道你已经尝试过这个并说你无法让它工作 - 因此我的第二点)。您可能会发现此Microsoft IIS Forum thread有用。
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