Назад | Перейти на главную страницу

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

Мне очень трудно заставить исполняемый файл запускаться из 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, или у вас есть представление о том, как я могу его запустить?

Все процессы пользовательского режима в 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