【问题标题】:System.Diagnostics.Process impersonating other userSystem.Diagnostics.Process 模拟其他用户
【发布时间】:2012-01-10 23:35:45
【问题描述】:

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

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 环境中的某些东西导致了失败。

【问题讨论】:

标签: .net process impersonation


【解决方案1】:

我花了将近 2 天的时间来解决这个问题...... 这是解决方案:http://forums.asp.net/p/1032763/3054483.aspx

简单地说,您需要将“App Pool's Identity”设置为与您的“proc.StartInfo.UserName”“proc.StartInfo.Password”相同

您可以更改“DefaultAppPool” 的标识或创建一个新的“应用程序池”,使用您的“proc.StartInfo.UserName”作为标识。 p>

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

希望有用,祝你好运。 呵呵

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我正在从 ASP.NET 执行。在管理员帐户下运行它是不可取的。但我会将代码移动到控制台应用程序以查看症状是否消失。关于将输出重定向到文件然后读取文件的有趣想法,但子进程似乎甚至没有执行。我现在把它输出到一个文件中,当它使用用户凭据运行时,该文件没有得到更新。
    • 哦,你没有提到 ASP.NET。据我所知,Web 应用程序是在安装时定义的特殊帐户下运行的。这意味着您的 exe 被放置在 asp 文件夹内的某个位置。您指定的用户是否可能无权访问该文件夹?
    • 我在控制台应用程序中运行它并且它工作正常,所以 ASP.NET 绝对是罪魁祸首。我将尝试将 ASP.NET 进程作为系统帐户运行,看看它是否可以这样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多