我有一个Windows Form应用程序,它向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时,它就会捕获它。因此,这种“无效的句柄”是在通过信用之后发生的。关于我可能会忽略或搞砸的任何想法?

最佳答案

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

例如:

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

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

关于c# - .NET进程使用凭据启动进程错误(句柄无效),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/628191/

10-17 02:05