Запустите консольное приложение (.exe) из приложения ASP.NET (IIS 7,5)

У меня есть приложение ASP.NET в Windows 2008 R2 (.NET Framework 4.0, IIS 7.5), и я хочу запускать консольное приложение при нажатии кнопки на веб-странице. Вот код:

protected void btnUpdate_Click(object sender, EventArgs e)
    {
        string fileLocation = @"D:\DTDocs\App_Code\LoadDTDocsXML.exe";
        ProcessStartInfo oStartInfo = new ProcessStartInfo();
        oStartInfo.FileName = fileLocation;
        oStartInfo.UseShellExecute = false;
        Process.Start(oStartInfo);
}

Когда я запускаю приложение ASP.NET из Visual Studio 2010 (с его внутренним IIS), консольное приложение работает нормально. Но когда я запускаю приложение ASP.NET вне VS 2010, у меня нет ошибки, но консольное приложение не выполняет свою работу (оно должно создать файл xml на диске). Я думаю, проблема в конфигурации IIS 7.5, я не знаю точно, какой учетной записи я должен предоставить права доступа к папкам, задействованным в моем консольном приложении. В IIS 7.5 я установил Учетные данные физического пути для Конкретного пользователя = моя учетная запись Windows, но это не решило проблему. Спасибо.


person Antonache Radu    schedule 24.01.2012    source источник
comment
Откуда ты знаешь, что он не работает?   -  person Basic    schedule 25.01.2012


Ответы (3)


Просто чтобы добавить к двум другим ответам: вам действительно нужно запускать exe-файл с вашего веб-сервера?

Мне приходилось делать это в прошлом, и это почти всегда вариант последнего средства - это значительно ослабляет вашу безопасность (теперь все, что кто-то должен сделать для запуска исполняемых файлов в вашей системе, это найти один недостаток в вашем коде) и имеет целый ряд других проблем (веб-сервер не «вошел в систему» ​​на сервере, поэтому у него нет рабочего стола, олицетворение — настоящая проблема в a$$, чтобы заставить его работать должным образом (при условии, что вы собираетесь запустить исполняемый файл с разными разрешениями для веб-сервера) и т. д.

Если есть какой-либо другой способ достичь цели, он почти наверняка будет проще.

Вариант, который мы выбрали, заключался в том, чтобы иметь новое приложение с конечной точкой WCF, с которой может взаимодействовать веб-сервер. Таким образом, когда кто-то нажимает кнопку, WS вызывает наше приложение через WCF и приказывает ему выполнять различные команды. Таким образом, у вас есть:

  • Четкое разделение между веб-кодом и консольным кодом.
  • Хитрое консольное приложение не остановит веб-сервер и наоборот
  • Если консольное приложение работает долго, это позволяет вам распределять выпуски для веб-сайта/консольного приложения, чтобы вы не убивали приложение в середине выполнения только потому, что вам нужно обновить некоторые CSS и опубликовать.
  • Огромные преимущества безопасности — веб-сервер не может запускать исполняемые файлы, даже если они скомпрометированы.
  • Приложение WCF сможет тщательно проверять запросы, чтобы решить, допустимы ли они перед выполнением.

Имейте в виду, что как бы вы это ни делали, если кто-то злонамеренный поймет, что происходит, и сможет запустить процесс, он, вероятно, может сделать вам DoS практически без усилий — убедитесь, что этот метод заблокирован НАДЁЖНО.

Изменить: прочитав ваши комментарии выше, я думаю, вы столкнулись с проблемой «рабочего стола». При запуске исполняемого файла с сервера приложение никогда не будет видно вошедшему в систему пользователю, поскольку рабочий стол вошедшего пользователя недоступен из IIS и наоборот. Это очень похоже на проблему наличия графического интерфейса в службе Windows.

Это тоже может быть интересно.

person Basic    schedule 25.01.2012
comment
Меня поражает то, что консольное приложение запускается, когда я использую VS для запуска веб-приложения, а не когда я выхожу из VS, используя IIS. Спасибо за ответ, я ценю вашу точку зрения. - person Antonache Radu; 25.01.2012
comment
Очень вероятно, что IIS запускает приложение, просто вы его не видите. Что делает приложение? Попробуйте самостоятельно создать простое приложение, которое просто записывает в текстовый файл где-нибудь общедоступный. - person Basic; 25.01.2012
comment
Консольное приложение создает файл un xml, который содержит структуру и содержимое папки (которая становится виртуальным каталогом). Так что я могу видеть, работает ли консольное приложение. Я попробую ваше предложение создать простое приложение. Большое спасибо. - person Antonache Radu; 25.01.2012

первая проблема, которую я вижу, это безопасность/доступ к файлам. при запуске из VS сервер и клиент — это одна и та же машина под вашими учетными данными. при запуске в тестовой/производственной среде сервер и клиент физически являются разными машинами, и IIS будет запускать веб-сайт с ограниченными разрешениями. поэтому есть очень большая вероятность, что IIS не сможет получить доступ к файлу в D:... из-за безопасности.

следующая проблема — запуск консольного приложения с веб-сайта. консоль — это еще одна форма пользовательского интерфейса, такая же, как html и WPF. лично я бы не запускал консоль из Интернета (если бы не было другого выбора). Я бы интегрировал API в веб-приложение. 2 интерфейса с одинаковой логикой.

person Jason Meckley    schedule 24.01.2012
comment
Я использую проверку подлинности с помощью формы для своего веб-приложения и устанавливаю учетные данные физического пути (в IIS) для конкретного пользователя (моя учетная запись Windows, которая является администратором на сервере). Что меня озадачивает, так это то, что в VS все в порядке, и мне не удалось настроить IIS 7.5, чтобы приложение могло успешно запускать консольное приложение. Я хочу избежать перезаписи консольного приложения в веб-приложение, потому что (по крайней мере, для меня) это не так просто, поэтому я пытаюсь решить проблему таким образом. - person Antonache Radu; 25.01.2012
comment
инкапсулировать логику консоли в API, а затем ссылаться на API как в we, так и в console. сохраняя код DRY. - person Jason Meckley; 25.01.2012
comment
Большое спасибо, я следую вашим советам, и это очень удобно. - person Antonache Radu; 26.01.2012

ASP.NET Dev Server работает под учетными данными текущего пользователя (это вы). IIS 7.5 запускает приложения ASP.NET под пользователем, указанным в настройках пула приложений — обычно ApplicationPoolIdentity (к которому вы можете обращаться как к пользователю «IIS AppPool\[ApplicationPoolName]» при настройке разрешений для файлов). Вы также можете изменить его на «Сетевая служба» (значение по умолчанию в IIS 7.0).

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

person Daniel    schedule 24.01.2012
comment
Идентификатор, настроенный для моего пула приложений, установлен на «Пользовательский пользователь» (= моя учетная запись Windows, которая является администратором на сервере, и я дал ему явные разрешения для папок). Я уже пробовал с пользователем IIS APPPOOL\DefaultAppPool, но ничего не изменилось. Но я не знаю, какую роль играют учетные данные физического пути для моего приложения (сейчас установлена ​​​​та же учетная запись, что и в пуле приложений). - person Antonache Radu; 25.01.2012