【发布时间】:2010-02-19 04:17:51
【问题描述】:
问题
我有一个 PHP 脚本,它使用 shell_exec 运行 pdf 到文本转换器。为了简化问题,我创建了一个简短的脚本,它使用shell_exec 来回显dir 命令的输出。
<?php
$cmd = 'C:\\WINDOWS\\system32\\cmd.exe /c ';
echo shell_exec($cmd.' dir');
?>
当我在我的 Apache 服务器上运行它时,一切都按预期工作。当我切换到 IIS 时,就好像完全跳过了这行:没有错误、没有输出、没有日志、什么都没有。
不幸的是,我需要使用 IIS,因为我要针对 Active Directory 对我的用户进行身份验证。
这是我迄今为止尝试过的:
- 通过
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 或权限本身的问题,而是我们网络上的某些策略的结果 - 尽管我无法想象是什么。左派有什么想法吗?
【问题讨论】:
-
这可能是有史以来最愚蠢的建议,但如果这是您的整个脚本,并且当您从 IIS 请求时查看源代码,您真的看到 PHP 源代码吗?尝试在 PHP 文件的开始标记之前添加
HERE!
和 echo 'and here!
';在开始 PHP 标记之后。只是为了确保正确解析 PHP。 :-) -
感谢 janmoesen 的建议,不是一个愚蠢的建议,很好的解决问题!事实上,我已经尝试过了,并且确实从其他所有内容中获得了输出。就好像整个脚本都在运行,只是方便地跳过了
shell_exec()部分。
标签: php windows iis shell-exec