Как НЕ ждать выхода с помощью Impersonataion.RunProcess в c # / ASP.NET - PullRequest
1 голос
/ 18 января 2012

Я хочу знать, есть ли способ НЕ ждать процесса при использовании олицетворения. Перегрузок нет, поэтому я не уверен, как это сделать.

// always waits for exit to continue
Impersonation.RunProcess(someProcessPath);

Причина, по которой я хочу это сделать, заключается в том, что у меня есть долго выполняющееся приложение, которое обрабатывает большие файлы, но я хочу доставить клиенту ответ об успешном завершении процесса, прежде чем перенаправить их на страницу состояния. Я не могу запустить процесс с обычным process.Start (), потому что IUSER должен олицетворять учетную запись пользователя с повышенными правами.

Я даже пытался использовать process.StartInfo после Impersonation.Login () и указывать un / pass, но я думаю, что статус «залогинен» является частью только статического класса Impersonation.

if (Impersonation.Logon(LoginCredentials.UserName, LoginCredentials.Password))
{
                // this fails with an invalid privileges exit code
                process.StartInfo.FileName = path;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.UserName = "Administrator";                    
                SecureString secString  = new SecureString();
                foreach( char c in "mypassword" )
                    secString.AppendChar( c );
                process.StartInfo.Password = secString;
                process.StartInfo.Verb = "runas";
                process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                process.Start();
 }

Я нашел миллионы сообщений о том, как дождаться завершения нормально вызванного процесса, прежде чем продолжать использовать Process.WaitForExit (). Я также успешно проигнорировал выход, используя process.start () сам по себе в консольных приложениях (уже прошедших проверку подлинности).

Ответы [ 2 ]

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

Вы можете преобразовать его в другой поток:

// using ThreadPool for long running tasks is discouraged so create a new thread
var t = new Thread(() => Impersonation.RunProcess(someProcessPath)) { IsBackground = true };
t.Start();

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

0 голосов
/ 18 января 2012
Impersonation.RunProcess("/path/to/cmd.exe /C start "+someProcessPath);

Возвращается после завершения cmd.exe, то есть после , начиная с someProcessPath

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