1

我使用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。

4

2 回答 2

1

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

外卖: exec和朋友不是为了启动交互过程。

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

于 2012-10-05T11:20:53.250 回答
1

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

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

It may also be the case that the user that the web server is running as does not have execute permissions on the folder that notepad is in (assuming it had the relevant path).

于 2012-10-05T11:21:09.560 回答