如何在c#/ASP.NET中使用Impersonataion.RunProcess不等待退出
我想知道的是,在使用模拟时,是否有一种不等待进程的方法。没有过载,所以我不知道如何做到这一点如何在c#/ASP.NET中使用Impersonataion.RunProcess不等待退出,c#,asp.net,vb.net,impersonation,privileges,C#,Asp.net,Vb.net,Impersonation,Privileges,我想知道的是,在使用模拟时,是否有一种不等待进程的方法。没有过载,所以我不知道如何做到这一点 // always waits for exit to continue Impersonation.RunProcess(someProcessPath); 我之所以要这样做,是因为我有一个处理大型文件的长时间执行的应用程序,但我希望在将它们定向到状态页之前,向客户机发送一个成功的响应,说明进程已经开始。我无法使用普通process.Start()运行该进程,因为IUSER需要模拟提升的用户帐户 我
// always waits for exit to continue
Impersonation.RunProcess(someProcessPath);
我之所以要这样做,是因为我有一个处理大型文件的长时间执行的应用程序,但我希望在将它们定向到状态页之前,向客户机发送一个成功的响应,说明进程已经开始。我无法使用普通process.Start()运行该进程,因为IUSER需要模拟提升的用户帐户
我甚至尝试在模拟.Login()之后使用process.StartInfo并提供un/pass,但我认为“登录”状态只是静态模拟类的一部分
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()本身成功地忽略了退出
这将在cmd.exe结束时返回,这是在启动someProcessPath之后,您可以将其分叉到另一个线程:
// using ThreadPool for long running tasks is discouraged so create a new thread
var t = new Thread(() => Impersonation.RunProcess(someProcessPath)) { IsBackground = true };
t.Start();
您可以在thread方法中设置一些标志,以指示调用它的时间和完成时间。这似乎仍然没有传递经过身份验证的凭据,它会立即退出(我在第一行将someProcess写入日志文件,以便知道它是否已运行)。我还通过在服务器上使用cmd手动运行路径进行了确认,它按预期启动。这似乎启动了应用程序(我可以在taskman中看到),但日志文件中的“我还活着”标记从未显示,应用程序从未退出,也未执行任何任务。同样,我可以手动启动它只是罚款。。。但是,它确实允许web请求完成。在尝试了所有方法以找到一个优雅的.NET解决方案之后,我的解决方法是在前端执行两个ajax调用。一次调用保存/确认数据,另一次调用仅调用流程的服务,其中浏览器忽略响应并让其超时。授予IUSER必要的权限而不是模拟不是更容易吗?例如,您还可以在文件系统级别限制对所需文件夹的权限或只读访问权限等。即使使用ISUSRS帐户,该进程仍需要很长时间才能在线程上退出。
// using ThreadPool for long running tasks is discouraged so create a new thread
var t = new Thread(() => Impersonation.RunProcess(someProcessPath)) { IsBackground = true };
t.Start();