9

我有一个 Windows 窗体应用程序,它向 StartInfo 提供用户名、域和密码,它会抛出这个:

System.ComponentModel.Win32Exception:句柄 在 System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) 在 System.Diagnostics.Process.Start() 处无效

当我允许将凭据默认为当前用户时,我不会收到此类错误,并且我启动的过程可以在不需要使用凭据的范围内工作(凭据对于在 MSBuild 脚本中映射驱动器是必需的)。这是填写开始信息的代码:

Process p = new Process();
ProcessStartInfo si = new ProcessStartInfo(buildApp, buildArgs);
si.WorkingDirectory = msBuildWorkingDir;
si.UserName = txtUserName.Text;
char[] psw = txtPassword.Text.ToCharArray();
SecureString ss = new SecureString();
for (int x = 0; x < psw.Length; x++)
{
    ss.AppendChar(psw[x]);
}
si.Password = ss;
si.Domain = "ABC";
si.RedirectStandardOutput = true;
si.UseShellExecute = false;
si.WorkingDirectory = txtWorkingDir.Text;
p.StartInfo = si;
p.Start();

并不是用户/psw 不匹配,因为例如,当我提供错误的 psw 时,它会捕获它。所以,这个“无效句柄”的事情是在信用通过之后发生的。关于我可能会忽略或搞砸的任何想法?

4

1 回答 1

22

您必须重定向您的输入、错误和输出。

例如:

ProcessStartInfo info = new ProcessStartInfo("cmd.exe");
 info.UseShellExecute = false;
 info.RedirectStandardInput = true;
 info.RedirectStandardError = true;
 info.RedirectStandardOutput = true;
 info.UserName = dialog.User;

 using (Process install = Process.Start(info)) {
       string output = install.StandardOutput.ReadToEnd();
       install.WaitForExit();
       // Do something with you output data       
    Console.WriteLine(output);
 }

微软还表示该错误应为“无法重定向输入”。(曾经有一个链接,但不再有效)

于 2009-03-09T22:03:48.830 回答