Подтвердить что ты не робот

System.Diagnostics.Process.Start не работает с IIS

Когда я запускаю System.Diagnostics.Process.Start из моего консольного приложения, он работает, но тот же код, когда я запускаюсь с моего веб-сервиса, размещенного в IIS, не работает.

Это что-то связано с привилегиями ASP.Net? если да, то как я могу настроить его из моего кода на С#.

4b9b3361

Ответ 1

Код управления веб-страницей и сервером ASP.NET выполняется в контексте рабочего процесса ASP.NET на веб-сервере. Если вы используете метод "Старт" на веб-странице или сервере ASP.NET, новый процесс выполняется на веб-сервере с ограниченными разрешениями. Процесс не запускается в том же контексте, что и клиентский браузер, и не имеет доступа к рабочему столу пользователя. http://msdn.microsoft.com/en-us/library/0w4h05yb.aspx

- предоставить разрешение для учетной записи рабочего процесса ASP.NET

для взаимодействия с рабочим столом или для запуска рабочего процесса ASP.NET в учетной записи SYSTEM.

  • Чтобы узнать, как запустить рабочий процесс в учетной записи SYSTEM        и узнать разрешения по умолчанию для учетной записи ASPNET, проверьте эту статью        INFO: Идентификация процесса и запроса в ASP.NET: http://support.microsoft.com/default.aspx?scid=kb;en-us;317012

- включить службу IIS Admin для взаимодействия с рабочим столом

Чтобы настроить это, выполните следующие действия.

  • а. Откройте панель управления и выполните следующие действия: Для Windows NT: нажмите "Службы". Для Windows 2000, Windows XP и .NET Server: нажмите "Администрирование", а затем "Службы".

  • б

    . Дважды щелкните службу IIS Admin.

  • с. На вкладке "Вход в систему" ​​установите флажок "Разрешить службу для взаимодействия с рабочим столом". Не забудьте запустить службу IIS Admin Service как локальную систему.
  • д. Остановите и перезапустите службу IIS Admin.

Ответ 2

У меня была аналогичная проблема, и возможность доступа к рабочему столу из службы не была проблемой. Он отлично работал, когда не выдавал себя за другого пользователя, но при попытке запустить процесс как другого пользователя он потерпел неудачу. Первое, что нужно сделать, когда он не запустится, - это узнать всю информацию о проблеме. Первый вопрос: возвращает ли Process.Start значение true или false. Во-вторых, возникли ли вы какие-либо исключения при попытке начать процесс.

Прежде чем вы сможете полностью исследовать, важно знать, был ли запущен Process.Start с использованием UseShellExecute или нет - это должно быть ложным для олицетворения, но в противном случае вы можете выбрать, использовать ли его, и он вызывает различные функции Win32 в зависимости от этого параметра.

Если вы выполняете процесс, который должен запускаться как другой пользователь, не пытайтесь использовать .NET-олицетворение - имя пользователя, пароль, домен StartInfo - это то, что вам нужно установить. Однако в IIS у вас есть дополнительная блокировка, и единственное решение, которое я нашел на Windows Server 2008, действительно связано с некоторыми вызовами Win32 и реализацией абстрактных библиотек безопасности. Многие сценарии, с которыми вы можете столкнуться, описаны здесь: http://asprosys.blogspot.co.uk/2009/03/perils-and-pitfalls-of-launching.html

Пример кода с этой страницы показывает, как вызвать библиотеку и добавить Windows Station и Desktop доступ к пользователю перед началом процесса в качестве этого пользователя. Это было то, что мне нужно, чтобы заставить Process.Start работать из IIS, исключив UAC, DEP и любые другие аббревиатуры из трех букв, о которых я мог подумать;)

Ответ 3

Если вы используете приложение Windows 7, вы не можете. в основном сервисы, выполняющие сеанс 0, и пользовательский рабочий стол, выполняющий сеанс 1, поэтому вы не можете общаться с сеанса 0 до сеанса 1. Даже если вы пытаетесь связаться с процессом входа в систему (который используется для запуска сеанса пользователя для каждого нового пользователя), вы можете 't получить некоторую локальную информацию (настройки браузера, такие как информация локального хранилища)

Ответ 4

Для меня что-то вроде этого:

ProcessStartInfo psi = new ProcessStartInfo();
psi.UseShellExecute = true;
psi.LoadUserProfile = true;
psi.WorkingDirectory = sender.Server.MapPath("../");// This line solved my problem
psi.FileName = sender.Server.MapPath("../myexecutable.exe");
psi.Arguments = "Myargument1 Myargument2";
Process.Start(psi);

`