У меня есть следующие асинхронные действия контроллера, которые позволяют мне запускать консольное приложение на удаленном сервере.Моя проблема связана с разрешениями и аутентификацией.Я попробовал следующее, , которое, в моем понимании, позволяет app.Start(valuationDate)
работать от имени другого пользователя .Причина этого заключается в том, что консольному приложению требуется доступ к сетевым ресурсам, а пользователь этого веб-приложения будет иметь необходимые права доступа.(Как примечание: консольное приложение выполняется как запланированная задача без ошибок)
Проблема, которую я подозреваю, состоит в том, что консольное приложение все еще выполняется под идентификатором пула приложений IIS, что вызывает ошибки сетевого ресурса «Отказано в доступе»,Само консольное приложение запускается, но ограниченный доступ к учетной записи пользователя IIS вызывает сбой.
Я попытался изменить удостоверение AppPool для запуска в качестве авторизованного пользователя, и процесс выполняется правильно.Я надеюсь на решение, которое не потребует от меня изменения удостоверения AppPool на сервере.
Как мне запустить консольное приложение, используя данные аутентифицированных пользователей?
Действия контроллера:
[HttpPost]
public void RunAsync(DateTime valuationDate)
{
AsyncManager.OutstandingOperations.Increment();
Task.Factory.StartNew(() => RunApp(valuationDate));
}
private void RunApp(DateTime valuationDate)
{
ConsoleWrapper app = new ConsoleWrapper();
WindowsIdentity winId = (WindowsIdentity)HttpContext.User.Identity;
WindowsImpersonationContext ctx = null;
try
{
ctx = winId.Impersonate();
app.Start(valuationDate);
}
catch (Exception e)
{
throw;
}
finally
{
if (ctx != null) {ctx.Undo();}
}
AsyncManager.Parameters["success"] = app.Success();
AsyncManager.Parameters["message"] = app.Message();
AsyncManager.OutstandingOperations.Decrement();
}
ConsoleWrapper:
public void Start(DateTime valuationDate)
{
var appExe = Config.Default.CONSOLE_APP;
InProgress = true;
log = String.Empty;
success = false;
message = String.Empty;
try
{
var process = new Process();
process.StartInfo.FileName = appExe;
process.StartInfo.Arguments = valuationDate.ToString("dd-MMM-yyyy");
process.EnableRaisingEvents = true;
process.StartInfo.UseShellExecute = true;
process.StartInfo.RedirectStandardOutput = true;
process.Exited += new EventHandler(process_Exited);
process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
process.Start();
process.WaitForExit();
}
catch (Exception e){/* snip */}
}