System.Diagnostics.Process冒充其他用户

时间:2011-12-01 20:31:59

标签: .net process impersonation

我有以下代码正在运行。我的回调方法是在生成程序的输出时调用的。

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();

但是,一旦我取消注释有关用户凭据的这三行,一切都会停止工作。代码执行时没有错误,但是进程没有运行,并且我的回调方法没有收到输出。

如何执行单独的进程,在生成时异步收集其输出,同时使用与执行进程不匹配的特定用户凭据?

更新
基于@ Dos095-russ的答案,我用控制台应用程序而不是ASP.NET测试了相同的代码。它确实有效。因此,ASP.NET环境中的某些东西导致了失败。

2 个答案:

答案 0 :(得分:2)

我花了差不多2天时间来解决这个问题...... 以下是解决方案:http://forums.asp.net/p/1032763/3054483.aspx

简而言之,您需要设置“应用程序池的标识”“proc.StartInfo.UserName”“proc.StartInfo.Password”相同“

您可以使用“proc.StartInfo.UserName”作为识别来更改识别“DefaultAppPool”创建新的“应用池”

当然,如果您创建一个新的“应用程序池”,则必须分配您的asp.net Web应用程序使用此“应用程序池”。

希望它有用,祝你好运。 lzch

答案 1 :(得分:0)

我认为问题出在UAC的安全机制中:您的初始应用程序无权读取另一个用户进程的输出(即使它是子进程)。尝试使用管理员权限启动应用程序,看看代码是否有效。

我认为解决问题的最佳方法是将子进程输出重定向到文件,并在初始应用程序中创建一个线程来检查该文件是否有更新。

还发现了类似的问题Get error and standard output from an elevated child process