.NET 4:使用凭据的Process.Start返回空输出

时间:2010-05-11 15:19:28

标签: .net .net-4.0 process.start

我从 ASP.NET

运行外部程序
var process = new Process();
var startInfo = process.StartInfo;

startInfo.FileName = filePath;
startInfo.Arguments = arguments;

startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
//startInfo.RedirectStandardError = true;

process.Start();

process.WaitForExit();

Console.Write("Output: {0}", process.StandardOutput.ReadToEnd());
//Console.Write("Error Output: {0}", process.StandardError.ReadToEnd());

使用此代码一切正常:执行外部程序并且 process.StandardOutput.ReadToEnd()返回正确的输出。

但是在 process.Start()之前添加这两行之后(在另一个用户帐户的上下文中运行程序):

startInfo.UserName = userName;
startInfo.Password = securePassword;

程序未执行且 process.StandardOutput.ReadToEnd()返回空字符串。没有例外。

userName securePassword 是正确的(如果凭据不正确,则会引发异常)。

如何在其他用户帐户的上下文中运行该程序?

环境: .NET 4,Windows Server 2008 32位

UPD:

该应用程序在ASP.NET开发服务器+ Windows 7下运行正常,但在IIS 7 + Windows Server 2008 Web Edition上失败。

UPD2:

在事件日志中找到了这个:

故障应用程序cryptcp.exe,版本3.33.0.0,时间戳0x4be18460,故障模块kernel32.dll,版本6.0.6002.18005,时间戳0x49e03821,异常代码0xc0000142,故障偏移0x00009eed,进程ID 0xbf4,应用程序启动时间0x01caf1b91f5b851a。

cryptcp.exe是外部应用程序的名称。

4 个答案:

答案 0 :(得分:3)

我意识到这是前一段时间被问到的,但我遇到了同样的问题并在此网站上找到了解决方案:The Perils and Pitfalls of Launching a Process Under New Credentials

应用程序无法正确初始化部分下应用解决方案为我修复了它。

希望这会节省一些时间和挫折!

答案 1 :(得分:2)

According to Microsoft,你无法读取标准输出和标准错误,因为它结束了死锁。要解决此问题,请使用以下内容:

private readonly StringBuilder outputText = new StringBuilder();
private readonly StringBuilder errorText = new StringBuilder();

。 。

        process.OutputDataReceived += delegate(
            object sendingProcess,
            DataReceivedEventArgs outLine)
        {
            if (!string.IsNullOrEmpty(outLine.Data))
            {
                outputText.AppendLine(outLine.Data);
            }
        };

        process.ErrorDataReceived += delegate(
            object sendingProcess,
            DataReceivedEventArgs errorLine)
        {
            if (!string.IsNullOrEmpty(errorLine.Data))
            {
                errorText.AppendLine(errorLine.Data);
            }
        };

        process.BeginOutputReadLine();
        process.BeginErrorReadLine();
        process.WaitForExit();
        Console.WriteLine(errorText.ToString());
        Console.WriteLine(outputText.ToString());

答案 2 :(得分:1)

查看MSDN documentation,其他一些项目建议配置为以另一个用户正确启动应用程序。

  1. 设置域名,用户名和密码属性(您应该设置域名)
  2. 默认使用用户名/密码将工作目录设置为system32文件夹
  3. 这可能有助于你解决问题。

答案 3 :(得分:1)

可能是您正在启动的应用程序需要加载它的配置文件(默认情况下,它不会被加载)。您是否尝试将LoadUserProfile属性设置为true?