Защо не може да стартира изпълним файл с функции 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, той няма разрешение за взаимодействие с работния плот, така че не може да отвори GUI, опитайте да стартирате скрипта директно с PHP на командния ред.

РЕДАКТИРАНЕ

Потребителят, използван за изпълнение на командата, е потребителят, който изпълнява PHP. За да промените потребителя, работещ с PHP, ще трябва да промените потребителя, работещ с Apache, ако искате този потребител да има разрешение за взаимодействие с работния плот, ще трябва да стартирате Apache сами, а не като услуга.

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

оставете процеса малко да заспи след изпълнение на командата на shell и потърсете в TaskManager за Notepad... Тогава ще видите, че това са двама различни потребители (и не виждате другите потребители Notepad)

person bwoebi    schedule 16.04.2013
comment
Напълно си прав! Сега виждам, че съм отворил процеси с потребител SYSTEM. Ще редактирам въпроса си. - person enenen; 16.04.2013
comment
sleep($interval); във вашия PHP-скрипт в края. (за секунди) - person bwoebi; 16.04.2013

Бележникът е програма с GUI, така че изисква 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 използва вариант на I believe), където можете да пренасочите изхода към различни TTY, които не е задължително да са локални, те могат да бъдат и отдалечени x сесии. Разбира се, всичко това е безсмислено, тъй като повечето unix сървъри нямат инсталиран X и както при unix, така и при windows сървърите рядко някой вижда изхода/работен плот. Всичко това, разбира се, е лудост, тъй като има огромна дупка в сигурността, следователно разделянето на приложението и операционната система. - person Dave; 16.04.2013