7

Я запускаю исполняемый процесс из моего приложения ASP.NET, когда пользователь нажимает кнопку. Этот процесс создает несколько файлов и обслуживает их до конечного пользователя. Я не могу понять, что происходит или не работает, но это не сработало, пока я не задал пользователю admin как идентификатор пула приложений на сервере. Я использую IIS7.Выполнение команды из идентификатора пула приложений ASP.NET

using (var proc = new Process()) 
{ 
    proc.StartInfo.FileName = Server.MapPath("~/Testing/Demo/MyExe.exe"); 
    proc.StartInfo.Arguments = String.Format("\"{0}\"", commandFilePath); 
    proc.StartInfo.UseShellExecute = true; 
    proc.Start(); 
    proc.WaitForExit(); 
} 

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

Спасибо!

+0

Как процесс обслуживает файлы для конечного пользователя? –

+0

Он хранится во временном каталоге, застегивает все файлы и обслуживает его. Это уже работает. – daniel

ответ

1

Благодарим всех вас за помощь. Все, что мне нужно было сделать, - установить файл StartInfo.WorkingDirectory где-нибудь, что я смог написать.

 using (var proc = new Process()) 
     { 
      proc.StartInfo.FileName = Server.MapPath("~/Testing/Demo/MyEXE.exe"); 
      proc.StartInfo.Arguments = String.Format("\"{0}\"", commandFile); 
      proc.StartInfo.WorkingDirectory = savePath; 
      proc.Start(); 
      proc.WaitForExit(); 
     } 

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

2

Возможно, это проблема с правами на файл/выполнение. Попробуйте присвоить execute разрешения ApplicationPoolIdentity на ~/Testing/Dema/MyExe.exe и read разрешения на commandFilePath. Вы упомянули, что ваш процесс создает файлы. Вам нужно будет предоставить modify или full control разрешениям ApplicationPoolIdentity в папке, где будут созданы файлы. Вот матрица list of permissions.

См. assign permissions to ApplicationPoolIdentity account для получения информации о предоставлении разрешений.

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

Проводник процессов также может отображать запросы доступа к файлу. Вот статья о технике на troubleshooting with Process Explorer.

+0

Согласовано. Место записи работает отлично уже ... это разрешения на выполнение. Как я могу изменить ApplicationPoolIdentity, чтобы иметь разрешения на выполнение? – daniel

+0

Он использует учетную запись IUSR ... и эта учетная запись имеет полные права доступа к каталогу. Должен ли я все же делать то, что упоминается в этом потоке? – daniel

+0

Вы можете запустить ProcessExplorer, а затем запустить приложение под учетной записью администратора и регистрировать (через ProcessExplorer) всю активность при успешном запуске приложения. Затем перейдите в режим работы под учетной записью IUSR и сравните журналы ProcessExplorer. –

3

Прежде всего, зачем нужна оболочка для ее выполнения? Не консольное приложение - вы открываете какое-либо окно?

Во-вторых, вам нужно перенаправить вход и выход.

И последнее, что вам нужно сделать, - это разместить в каталоге, в котором работает ваш скрипт, разрешение для пользователя под управлением вашего пула. И удалите Admin из вашего пула.

proc.StartInfo.UseShellExecute = false; 
proc.StartInfo.CreateNoWindow = false; 
proc.StartInfo.RedirectStandardError = true; 
proc.StartInfo.RedirectStandardOutput = true; 
proc.StartInfo.RedirectStandardInput = true; 

proc.Start(); 

proc.StandardInput.Flush(); 
proc.StandardInput.Close(); 

proc.WaitForExit(); 
proc.Close(); 

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

Я не могу видеть, что этот процесс или не делает

Вы можете посмотреть, если вы используете на сервере Process Explorer и посмотреть, если его работает, если его закрытия, если его остановить, но остаться там.

+0

Я вижу, что процесс запускается на секунду, а затем заканчивается ... Я предполагаю отсутствие разрешений. – daniel

+0

@ daniel, если вы его начинаете, то это не разрешения на запуск. Добавьте некоторый журнал в ваше приложение, чтобы узнать, почему останавливается. – Aristos

+0

Всегда запускайте команду, и она сообщает вам, что вам нужно «запускать как администратор»? Процесс все равно может начаться, но он не сможет ничего сделать без повышенных разрешений. – daniel

1

Всякий раз, когда вы запускаете любой процесс со страницы ASP.NET, он выполняется в контексте безопасности рабочего процесса, привилегии учетной записи пула приложений. Это не похоже на то, что вы, как правило, запускаете MyExe.exe, в этом случае он будет запускаться с помощью зарегистрированной учетной записи. Именно из-за этого ваш код работал, когда вы дали учетную запись администратора в пул приложений.

Существует много способов решить эту проблему.

Одним из самых простых было бы изменить идентификатор пула приложений на сетевую службу и добавить сетевую службу к разрешениям папок, в которых MyExe.exe будет обращаться к форме файлов.

Надеюсь, это поможет.

+0

Служба сети не предоставляет доступ к каталогу inetsrv. – daniel