Как я могу запустить программу или пакетный файл на стороне клиента?

Как я могу запустить пакетный файл на стороне клиента? Исполняемый файл? Просто открыть предустановленную программу на стороне клиента?

[Редактировать]

Что касается ActiveX, я пробовал

    var activeXObj = new ActiveXObject("Shell.Application");
    activeXObj.ShellExecute("C:\\WINDOWS\\NOTEPAD.EXE", "", "", "open", "1");

но это не работает. Какие-либо предложения?


person Ahmed Atia    schedule 18.05.2009    source источник
comment
Это невозможно - javascript специально разработан, чтобы НЕ допускать этого, потому что это было бы ОГРОМНОЙ дырой в безопасности. Обязательно или нет, вы не можете этого сделать.   -  person Joel Coehoorn    schedule 18.05.2009
comment
Никогда не говори никогда :) Предустановленная программа может установить элемент управления ActiveX, позволяющий запускать ее из JavaScript. (Отказ от ответственности: это было бы ужасно и невероятно дорого, я не призываю вас на самом деле попробовать это)   -  person Andomar    schedule 18.05.2009
comment
Вы имеете в виду, что вы на самом деле просите SO о дыре в браузере? Вот к чему этот вопрос. Я не уверен, что имеет значение, является ли это вашим предустановленным приложением или нет. Есть некоторые вещи, с которыми мы не должны хотеть помогать на SO. Я не думаю, что вы действительно понимаете, что вы просите.   -  person cgp    schedule 18.05.2009
comment
Flash player — это приложение, и его можно запустить из JavaScript. Без него нет ютуба!   -  person Andomar    schedule 18.05.2009
comment
Я думаю, возможно, мы должны спросить в этот момент - что вы на самом деле хотите сделать? Что вы пытаетесь выполнить на клиенте, что вы хотите сделать из браузера? Другими словами, почему?   -  person Michael Kohne    schedule 18.05.2009
comment
Просто мне нужно запустить пакетный файл для выполнения определенных действий на стороне клиента, этот пакет должен быть запущен на стороне ckint, просто по требованию заказчика.   -  person Ahmed Atia    schedule 19.05.2009
comment
возможный дубликат EXE из JavaScript   -  person Sarfraz    schedule 11.08.2010
comment
Для Internet Explorer вы должны добавить веб-сервер в список доверенных сайтов, а в разделе «Настройка» вы должны установить разрешения управления ActiveX на «Спрашивать».   -  person KikoV    schedule 01.03.2013
comment
почему бы вам не сказать пользователю загрузить пакетный файл и выполнить его? Вы можете сделать это с помощью html, без javascript.   -  person Trylks    schedule 20.01.2014


Ответы (8)


Из Javascript? Вы не можете. Это угроза безопасности. Подумайте об этом — хотели бы вы, чтобы каждый веб-сайт мог запускать программы на вашем ПК?

person pjc50    schedule 18.05.2009
comment
Я знаю, что это угроза безопасности, но это срочное требование для запуска предустановленной программы на клиенте и из Javascript? - person Ahmed Atia; 18.05.2009
comment
Например, у вас может быть пакетный файл для восстановления сопоставления дисков на сайте интрасети. - person Andomar; 18.05.2009
comment
Возможно, вы сможете добиться этого с помощью Microsoft ClickOnce (ненадежно, требуется IE и приложение .NET). Еще немного контекста: где находится эта веб-страница? Что такое приложение? - person pjc50; 18.05.2009
comment
pjc50 означает не угрозу безопасности в том смысле, что это нецелесообразно, а скорее угрозу безопасности в том смысле, что браузеры этого не допустят. - person Matt G; 18.05.2009

Вы имеете в виду запуск внешней программы через окно браузера с использованием JavaScript? Ни в коем случае вы не можете сделать это! Это чертова черная дыра безопасности!

person DreamSonic    schedule 18.05.2009

Если у вас действительно есть контроль над клиентом, вы можете установить какую-нибудь удаленную службу демона на стороне клиента, например SSH.

PS. Однако вызовите его через свой «серверный код».

Обновлено:

Не расстраивайтесь. Вы можете абсолютно безопасно сделать это.

  1. Во-первых, вам нужна демон-служба на клиенте, которая будет выполнять задачу вызова вашего приложения. Лично я предпочел бы построить простой rpc-сервер как Windows-сервис на C++ или Delphi; но многие другие виды серверов также могут выполнять эту работу (SSH, Apache, Telnet)

  2. Затем создайте веб-страницы, которые позволяют пользователю «зарегистрировать» свои службы с надлежащей аутентификацией для вызова этой службы (пароль, ключ безопасности).

  3. Если вы хотите вызвать свое приложение с веб-страницы на уже зарегистрированном клиенте, сделайте ajax-вызов (xmlhttprequest) на ваш сервер.

  4. Сервер должен проверить запрашиваемый IP-адрес с помощью зарегистрированной информации.

  5. Затем выполните удаленный вызов команды клиенту с зарегистрированной информацией.

Может быть какая-то сетевая ситуация, что эта схема может не работать. Однако, если вы действительно контролируете среду выполнения, всегда есть обходные пути.

person Sake    schedule 18.05.2009
comment
Но как это сделать с веб-страницы/javascript? - person Ahmed Atia; 18.05.2009
comment
Сделайте ajax-вызов на ваш сервер. - person Sake; 18.05.2009
comment
Это по-прежнему ужасное решение, но оно настолько уморительно смешное, что просто потрясающее. И теоретически это можно было бы сделать и быть безопасным, если предположить, что вы можете доверять серверу, чтобы иметь SSH-доступ к клиенту. Это применимо только к настройкам интрасети, и на самом деле это никогда не будет хорошим практическим решением, но это потрясающе и без надстроек браузера (например, Flash, Silverlight, Java-апплеты)! Требуется слишком много настроек, чтобы его могли использовать пользователи-идиоты, которые даже запросили бы это. - person bambams; 23.01.2015
comment
Наконец-то здесь кто-то разбирается. Все ответы есть. Устарело в этом. Сайт. Спасибо, приятель - person jagapathi; 28.02.2019

Перенаправьте клиента на http://yourserver/batchfile.bat. В некоторых браузерах пользователю будет предложено запустить командный файл.

person Andomar    schedule 18.05.2009
comment
yourserver/batchfile.bat — на стороне сервера, а исполняемый файл — на стороне клиента? - person Ahmed Atia; 18.05.2009
comment
Он загрузит пакетный файл на ПК и выполнит его там, если пользователь выберет «Выполнить». - person Andomar; 18.05.2009
comment
@Ahmed: он предлагает указать браузеру загрузить файл .bat и заставить пользователя выполнить его. - person belgariontheking; 18.05.2009
comment
@Ahmed, ... и пакетный файл вполне может ссылаться на локально установленный материал. - person TheBlastOne; 14.09.2011

Если проблема заключается в том, что пакетный файл отображается в браузере, вам необходимо установить Content-Type и Content-Disposition в заголовке HTTP, чтобы пользователю было предложено сохранить (или запустить) файл, а не отображать его в браузере.

Вы не сможете запустить файл без подтверждения пользователя, но это не должно быть проблемой.

Посмотрите на этот вопрос подробнее.

person Dave Webb    schedule 18.05.2009

В принципе, вы не можете. Если вам нужно запустить что-то на стороне клиента, вам понадобится совершенно другой механизм, предположительно со встроенной защитой. В предыдущем постере упоминался psexec (http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx), который, очевидно, будет работать только при наличии соответствующих разрешений. в целевой системе и полностью вне браузера.

По сути, то, о чем вы просите, является БОЛЬШОЙ, БОЛЬШОЙ проблемой, если бы вы смогли сделать это легко.

Вы можете заглянуть в ActiveX, но я не знаю, какие ограничения существуют для объекта ActiveX в наши дни (я знаю, что ограничения ЕСТЬ, но, возможно, вы можете работать в них).

person Michael Kohne    schedule 18.05.2009
comment
Итак... JavaScript просит сервер запустить psexec для запуска программы на клиенте? Думаю, сработает. - person Andomar; 18.05.2009
comment
Ну да. И опять же, это работает только в том случае, если сервер работает от имени пользователя, имеющего соответствующие разрешения на клиенте. - person Michael Kohne; 18.05.2009

Это не разрешено напрямую из соображений безопасности. Помимо всех остальных ответов, есть еще одна идея.

Вы можете создать службу отдыха localhost в своей предустановленной программе и использовать javascript для ее вызова с помощью команды или данных, при условии, что вы пишете предустановленную программу, и служба должна работать при вызове. Это решение работает в некоторых сценариях.

person frank    schedule 03.07.2021

person    schedule
comment
Приведенное выше решение работает только в IE, требуется разрешение пользователя для запуска ActiveX, но ОНО РАБОТАЕТ!! - person yurin; 23.02.2016