9

StartInfoにユーザー名、ドメイン、およびパスワードを提供するWindowsフォームアプリケーションがあり、これをスローします。

System.ComponentModel.Win32Exception: System.Diagnostics.Process.Start()のSystem.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)でハンドルが無効です

クレデンシャルを現在のユーザーにデフォルト設定することを許可すると、そのようなエラーは発生せず、開始するプロセスは、クレデンシャルを使用する必要がない範囲で機能します(クレデンシャルは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を提供​​すると、それをキャッチするため、user/pswが一致していないわけではありません。したがって、この「無効なハンドル」は、credが渡された後に発生します。何を省略したり、台無しにしたりする可能性があるかについてのアイデアはありますか?

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 に答える