Запуск командного файла из PHP - обнаружение интерактивных служб? [closed]

Мне очень трудно заставить исполняемый файл запускаться из PHP-скрипта (с помощью exec () или ряда других PHP-команд, которые я пытался).

Проблема, похоже, сводится к вопросу о правах пользователя (возможно?) Или конфигурации Windows / сервера, о которой я знаю очень мало.

В настоящее время я тестирую на локальном хосте Windows, используя WAMPserver. В настоящее время у меня есть файл .bat с командой для запуска моего исполняемого файла, так же, как я бы запускал его из командной строки. При запуске из командной строки .exe работает нормально; аналогично, когда я щелкаю файл .bat напрямую, он запускается и запускает .exe, как должен. Однако, когда я пытаюсь запустить его из сценария PHP (в настоящее время с помощью exec ('open.bat'); , хотя я пробовал множество других способов его запуска), он активирует то, что называется " Обнаружение интерактивных служб Windows ".

Из того, что я читал, это имеет какое-то отношение к "сеансам" Windows, когда пользовательские программы запускаются в сеансе 1, а системные процессы запускаются в сеансе 0, в целях безопасности. Но по какой-то причине мне разрешено запускать .bat нормально, если я просто нажимаю на него.

Так, возможно, это связано с пользователем, у которого PHP выполняет командный файл?

Я пробовал несколько способов запустить файл от имени другого пользователя, например, используя CPAU , который позволяет программе выполняться под другим пользователем. Опять же, при прямом нажатии на командный файл программа работала нормально, но при активации из PHP она не работала (при использовании CPAU вместо всплывающего окна Interactive Services Detection она просто ничего не делала).

Сталкивался ли кто-нибудь с подобной проблемой при попытке запустить исполняемый файл из PHP, или у вас есть представление о том, как я могу его запустить?

2
задан 29 December 2012 в 03:31
1 ответ

Все процессы пользовательского режима в Windows выполняются как «пользователь», даже если этот «пользователь» - «Локальная система». Следовательно, все службы Windows работают как «пользователь». IIS или Apache, что бы вы ни использовали, запускается от имени пользователя.

Этот пользователь - не вы.

Даже если вы запустили свой веб-сервер (службу Windows) под своей учетной записью, новый сеанс входа в систему не будет «Ваш» сеанс входа в систему все равно не будет создан, потому что система входит в другой экземпляр вашей учетной записи. Учетные записи пользователей и сеансы входа в систему - это разные вещи. Каждый сеанс интерактивного входа в систему имеет отдельный рабочий стол, поэтому все, что делала служба, включая отображение вещей на своем рабочем столе, происходило на ее рабочем столе, а не на вашем.

Пакетный файл и исполняемый файл работают должным образом, когда вы нажимаете на них, потому что они запускаются в вашем сеансе. Когда Windows обнаруживает, что программа, запущенная как служба, пытается взаимодействовать с рабочим столом, запускается интерактивное обнаружение служб (которое само работает как служба Windows). Причина в том, что службы Windows должны быть полностью не интерактивными и не иметь графического интерфейса пользователя, который требует участия человека. В противном случае вы, вероятно, имеете дело с исполняемым файлом, который не был хорошо разработан для службы Windows. Тем не менее, вы должны иметь возможность нажать «Просмотреть сообщение» или любой другой запрос от Interactive Services Detection, и он временно переведет вас на рабочий стол сеанса 0 для взаимодействия с графическим интерфейсом «службы», но он также прервет ваш рабочий стол, пока вы на Сессии 0 ' рабочий стол. (Он создает новый процесс в вашем сеансе, чтобы сообщить вам, что что-то в сеансе 0 требует вашего внимания.)

Хорошо, что вы на самом деле можете с этим поделать? Ну, вы на самом деле не предоставили никаких подробностей о том, что это за исполняемый файл, который вы запускаете как служба Windows, или что он делает, но похоже, что вы хотите, чтобы он запускался в сеансе на ваш рабочий стол, чтобы вы могли взаимодействовать с ним, как с Solitaire.exe.

Что ж, запуск вещей в сеансах других пользователей не является рутинным действием в Windows, но psexec должен это делать .

psexec.exe \\computername -i 1 program.exe

В приведенном выше примере число 1 указывает, в каком сеансе запускать program.exe. Если вы хотите вручную запустить обнаружение интерактивных служб, используйте сеанс 0.

Для дальнейшего чтения: http: // blogs.msdn. com / b / patricka / archive / 2010/04/27 / what-is-interactive-services-detection-and-why-is-it-blinking-at-me.aspx

2
ответ дан 3 December 2019 в 11:50

Теги

Похожие вопросы