Почему нельзя запустить исполняемый файл с функциями exec() или system()?

Я пытаюсь запустить notepad на сервере (пока localhost).

Функции exec() и system() работают нормально, например, когда пишут ping 127.0.0.1.

Но это не работает (работает нормально, если я пишу команду прямо в командной строке):

$command = "C:\WINDOWS\system32\notepad.exe";

$result = system($command);

print_r($result);

Использование Windows XP с xampp. Возможно, у меня нет прав, потому что команда выполняется из какой-то другой учетной записи, но я не знаю, как это проверить.

Любые советы?

Изменить:

Как сказал bwoebi, я открыл процессы, но они открываются от другого пользователя (SYSTEM), и я не вижу, когда приложение открыто. Итак, я должен перефразировать свой вопрос: как изменить пользователя, который используется при выполнении команд из PHP-скрипта?


person enenen    schedule 16.04.2013    source источник


Ответы (3)


Сначала вам нужно избежать обратной косой черты в вашей командной строке, если вы не используете одинарные кавычки:

$command = "C:\\WINDOWS\\system32\\notepad.exe";

Также обратите внимание, что если Apache работает как служба Windows, у него нет разрешения на взаимодействие с рабочим столом, поэтому он не может открыть графический интерфейс, попробуйте запустить скрипт непосредственно с помощью PHP в командной строке.

ИЗМЕНИТЬ

Пользователь, используемый для запуска команды, — это пользователь, который запускает PHP. Чтобы изменить пользователя, работающего с PHP, вам нужно изменить пользователя, работающего с Apache. Если вы хотите, чтобы у этого пользователя было разрешение на взаимодействие с рабочим столом, вам придется запускать Apache самостоятельно, а не как службу.

person zakinster    schedule 16.04.2013
comment
Ваша проблема, кажется, в другом, но обратите внимание, что вам нужно как-то избежать обратной косой черты. Также попробуйте мое последнее предложение редактирования. - person zakinster; 16.04.2013
comment
спасибо, я пытаюсь открыть графический интерфейс с помощью xampp и vertrigo, они работают, только wamp не может запустить графический интерфейс (из-за запуска в качестве службы). Я пытаюсь сравнить конфигурацию между ними, и не повезло. но ваш комментарий объясняет, почему мое расследование зашло в тупик. мое решение запускает mysql через wamp и использует php -S 127.0.0.1:80 (php › 5.4) для запуска веб-сервера, тогда exec может запускать приложение gui. позже я найду лучшее решение. - person caoglish; 28.11.2013

дайте процессу немного поспать после выполнения команды оболочки и найдите в TaskManager Блокнот... Тогда вы увидите, что это два разных пользователя (и вы не видите других пользователей Блокнота)

person bwoebi    schedule 16.04.2013
comment
Вы абсолютно правы! Теперь я вижу, что я открыл процессы с пользователем SYSTEM. Я отредактирую свой вопрос. - person enenen; 16.04.2013
comment
sleep($interval); в вашем PHP-скрипте в конце. (в секундах) - person bwoebi; 16.04.2013

Блокнот — это программа с графическим интерфейсом, поэтому требуется, чтобы Windows TTY был активен.

Ping — это командная строка, поэтому система может запускать его напрямую и передавать результаты вызывающей программе.

Не вдаваясь в подробности того, как работает ОС, в основном это невозможно сделать на машине с Windows (это возможно на машинах Unix, но сложнее).

person Dave    schedule 16.04.2013
comment
Я точно не знаю, но когда я пишу на своем OS X shell_exec("open /Application/TextEdit.app");, он открывается, только как не тот пользователь. - person bwoebi; 16.04.2013
comment
@bwoebi Его следует открывать как пользователь, работающий с PHP, который, вероятно, является пользователем, работающим с веб-сервером, так что это не очень удивительно. - person zakinster; 16.04.2013
comment
@zakinster именно то, что я хотел сказать не тому пользователю. - person bwoebi; 16.04.2013
comment
osx основан на * nix :) у вас есть apache, работающий в пользовательском пространстве, скорее всего, запустите apache как демон, а затем попробуйте еще раз :). На самом деле вы можете быть довольно забавным, используя оконный менеджер X (я полагаю, Darwin использует вариант), где вы можете перенаправлять вывод на разные TTY, которые не обязательно должны быть локальными, они также могут быть удаленными сеансами x. Конечно, все это бессмысленно, поскольку на большинстве серверов unix не установлен X, а на серверах unix и windows редко кто-либо видит вывод/рабочий стол. Все это, конечно, безумие, поскольку это огромная дыра в безопасности, отсюда и разделение приложения и ОС. - person Dave; 16.04.2013