【问题标题】:PHP - Can't open .exe files with exec commandPHP - 无法使用 exec 命令打开 .exe 文件
【发布时间】:2012-10-05 11:16:57
【问题描述】:

我使用 PHP 5.4IIS 7.5

如果执行一个简单的命令,就可以了

<?php
    exec("dir", $r);
    print_r($r);
?>

但是如果打开.exe文件,它不起作用,页面正在加载,直到php超时并且不打开记事本:

<?php
    exec("notepad.exe", $r);
    print_r($r);
?>

如果在命令行中执行记事本的php,它可以工作

php -f <file>

我认为问题出在 IIS 上,但我不知道是什么问题。谢谢!

更新

我做了另一个测试用例,不起作用,页面完成加载但没有删除任务:

<?php
    $r = exec("SCHTASKS.exe /Delete /TN TaskTest /F");
    print_r($r);
?>

IIS_IUSRS 具有执行 schtask 的权限。

解决方案

记事本打不开,因为它是一个交互式程序。

对于任务调度程序,将任务文件夹 (C:\Windows\System32\Tasks) 的读写权限授予 IUSR。

【问题讨论】:

    标签: php iis exec task scheduler


    【解决方案1】:

    是什么让你认为它不起作用?

    请注意,Windows 服务无法正常与桌面交互,因此 可能 记事本 正在启动,只是在您可以看到的任何地方都看不到它 - 并且作为PHP 将等待它终止,没有人可以看到它来终止它,它会超时,正如你所看到的。

    可能也可能是,运行 Web 服务器的用户对记事本所在的文件夹没有执行权限(假设它具有相关路径)。

    【讨论】:

    • 感谢您的回答。我做了另一个测试用例,但不起作用:$r = exec("SCHTASKS.exe /Delete /TN TaskTest /F");
    • IIS_USER 是否有权访问该任务?
    • 我在任务中没有权限......但现在在任务文件夹中但仍然不成功,“exec”函数将我返回为错误代码“1”。我会继续研究,非常感谢。
    • 已修复!谢谢!描述是解决方案。
    【解决方案2】:

    问题在于您指示exec 收集并返回衍生进程的输出,并且该进程必须终止才能发生。由于记事本不会立即终止,因此 PHP 会一直等待(您可以通过运行任何非交互式进程来测试这一点,例如 net.exe)。

    外卖exec 和朋友不是用来启动交互进程的。

    在任何情况下,exec 会生成一个命令解释器,而后者又会生成记事本。但是,由于最近的 Windows 版本中引入了安全功能,并且取决于运行 IIS 的用户,这些进程不会在您当前的桌面上创建可见窗口,因此您将看不到任何内容。您将能够验证它们是使用任务管理器或其他等效程序生成的。

    【讨论】:

    • 感谢您的回答,但我编辑了描述并添加了新的测试用例,其中包含一个结束且不起作用的过程。
    最近更新 更多