PHP - 无法使用exec命令打开.exe文件

时间:2012-10-05 11:16:58

标签: php iis exec task scheduler

我使用 PHP 5.4 IIS 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有权执行schtasks。

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

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

2 个答案:

答案 0 :(得分:1)

问题在于您指示exec收集并返回生成的进程的输出,而进程必须终止才能实现此目的。由于记事本不会立即终止PHP永远等待(您可以通过运行任何非交互式进程来测试它,例如net.exe)。

外卖: exec和朋友不打算启动互动流程。

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

答案 1 :(得分:1)

是什么让你觉得它不起作用?

请注意,Windows服务通常无法与桌面交互,因此可能是记事本 启动的情况,而不是您可以看到它的任何地方 - 以及PHP将等待它终止,没有人能看到它终止它,它会超时,正如你所看到的那样。

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

相关问题