Как запустить процесс из ASP.NET Web Service (и позволить ему делать все, что он хочет делать)? - PullRequest
3 голосов
/ 17 января 2011

На Amazon Server установлена ​​веб-служба. Exposed WebMethod должен запустить исполняемый файл. Но, похоже, что процесс (исполняемый файл), запущенный WebMethod, не имеет разрешения для завершения своей работы. Если WebMethod называется локально (с использованием IE на Amazon VM), я могу отследить некоторые события в файле журнала, расположенном по пути: C:\\LogFiles. Но, если он вызывается с удаленной машины, нет даже файлов журнала. Локально, на моей машине все отлично работает. Вопрос: есть ли способ или настройки в IIS7, позволяющие моему WebService создавать процесс, который может делать все, что я хочу? В файле web.config я добавил строку:

<identity impersonate="true" userName="USERNAME" password="password"/>

(имя пользователя и пароль, разумеется, правильно указаны в файле).

Кроме того, я попытался использовать имперсонализацию, как это объяснено здесь , но результата нет. Мой процесс не может выполнять свою работу, он даже не может отслеживать действия в файле журнала. Локально, на моей машине все отлично работает.

Есть идеи, как изменить настройки или что-то еще в IIS7?

РЕДАКТИРОВАТЬ: В дополнение к основному вопросу: мой WebService не может даже создавать файлы журнала по пути: C:\\LogFiles - хотя он может, если он запускался локально, но удаленно не существует простого файла журнала, который содержит некоторые строка. Как разрешить ему создавать простые текстовые файлы?

Ответы [ 3 ]

2 голосов
/ 17 января 2011

Если ничего не помогает, вы можете запустить такой процесс отдельно и заставить его ждать сигнала.Вы можете подавать сигнал разными способами - через IP-сокет, через почтовый ящик, через именованный канал.Веб-служба будет отправлять запросы в командный канал (или очередь), а процесс executor будет извлекать команды, выполнять их и ждать новых команд.

1 голос
/ 17 января 2011

Вы должны избегать попыток запуска внешних процессов из ASP.NET - если что, потому что ваше приложение будет работать в контексте учетной записи ASP.NET. (Да, вы можете использовать олицетворение для запуска другой учетной записи, но не пойдем туда)

Вместо этого установите Windows Service, которая может получать сигнал * для запуска желаемого исполняемого файла.

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

(*) Сигнализация может быть достигнута несколькими способами:

  • вызов службы WCF (с использованием службы WCF, размещенной службой Windows)
  • Отслеживание изменения файловой системы в известном каталоге.
0 голосов
/ 17 января 2011

Если бы вы использовали Linux, я бы дал вам самое умное решение когда-либо , установив флаг SUID, что невозможно в Windows.

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

Вы упомянули Amazon VM: я почти уверен, что они не позволят, по соображениям безопасности, чтобы исполнять олицетворение.[Добавить] Или, что еще лучше, они не позволят кому-либо писать в C:\

Опция 1

Переключиться на Mono / Linux, установить бит SUID с помощью chmod из консоли и рок !!

Вариант 2

Если вы можете запускать исполняемый файл не ASP.NET (т. Е. У вас есть удаленный рабочий стол, SSH *) в качестве привилегированной учетной записи (примечание: привилегированный не означает Администратор ), тогда вы можете изменить дизайн своего приложения, чтобы ASP.NET вызывал службы из вашего процесса-демона с использованием WCF, веб-служб или удаленного взаимодействия.Но в этом случае вам нужно изменить внешний вид исполняемого файла, чтобы он стал автономным сервером.

[Добавить] Ни одно из решений не будет исправлено, если ваш хостинг-провайдер не позволяет вам писать в таких путях, как C:\, но позволяет писать только под домашним каталогом.

* Работает и в Windows !!!!А я имею ввиду сервер !!!

...