System.Diagnostics.Process.Start не работает с IIS - PullRequest
17 голосов
/ 13 января 2011

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

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

Ответы [ 4 ]

16 голосов
/ 13 января 2011

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

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

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

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

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

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

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

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

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

У меня была похожая проблема, и возможность доступа к рабочему столу из службы не была проблемой. Он работал нормально, когда не выдавал себя за другого пользователя, но при попытке запустить процесс от имени другого пользователя это не удавалось. Первое, что нужно сделать, когда он не запустится, - это узнать всю возможную информацию о проблеме. Первый вопрос заключается в том, вернул ли 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 и любые другие трехбуквенные аббревиатуры, которые я мог придумать;)

0 голосов
/ 24 февраля 2017

Для меня то, что работает, выглядит примерно так:

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);

`

0 голосов
/ 06 января 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...