Запустите консольное приложение (.exe) из приложения ASP.NET (IIS 7,5) - PullRequest
2 голосов
/ 24 января 2012

У меня есть приложение 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), консольное приложение запускается Ok. Но когда я запускаю приложение ASP.NET вне VS 2010, у меня не возникает ошибки, но консольное приложение не выполняет свою работу (оно должно создать XML-файл на диске). Я думаю, что проблема заключается в конфигурации IIS 7.5, я не знаю точно, какой учетной записи я должен дать права доступа к папкам, задействованным в моем консольном приложении. В IIS 7.5 я установил Физический путь доступа для Определенный пользователь = моя учетная запись Windows, но это не решило проблему. Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 января 2012

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

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

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

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

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

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

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

Это также может представлять интерес.

1 голос
/ 24 января 2012

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

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

1 голос
/ 24 января 2012

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

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

...