System.Diagnostics.Process impersonating other use

2019-01-28 17:30发布

问题:

I have the following code which is working. My callback method is called with the program's output as it is generated.

var proc = new System.Diagnostics.Process();
//proc.StartInfo.Domain = DOMAIN;
//proc.StartInfo.UserName = USERNAME;
//proc.StartInfo.Password = BuildPasswordString();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.FileName = EXEC_PATH;
proc.StartInfo.Arguments = EXEC_ARGS;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
proc.OutputDataReceived += proc_OutputDataReceived;
proc.BeginOutputReadLine();
proc.WaitForExit();

However, as soon as I uncomment those three lines regarding user credentials, everything stops working. The code executes without an error, but the process doesn't run and no output is received in my callback method.

How can I execute a separate process, collect its output asynchronously as it is generated, while using a specific user's credentials that don't match the executing process?

Update:
Building off of @Dos095-russ's answer, I tested out the same code with a console application instead of ASP.NET. It does work. So it is something within the ASP.NET environment that is causing the failure.

回答1:

I spent almost 2 days to solve this problem... Here is the solution: http://forums.asp.net/p/1032763/3054483.aspx

Briefly, you need to set the "App Pool's Identity" same as your "proc.StartInfo.UserName" and "proc.StartInfo.Password".

You can either change the Identify of "DefaultAppPool" or create a new "App Pool" using your "proc.StartInfo.UserName" as the Identify.

Of course, if you create a new "App Pool", you have to assign your asp.net web application use this "App Pool".

Hope it's useful, good luck. lzch



回答2:

I think the problem is in security mechanism of UAC: your initial application have no rights to read output of the another user's process (even if it is a child process). Try to start your application with administrator privilegies and see if you code works.

I think the best way to solve your problem is to redirect your child process output to a file and make a thread in your initial apllication to check that file for updates.

Also found a similar problem Get error and standard output from an elevated child process