如何从C#Windows窗体中运行命令行代码?

时间:2012-08-09 21:36:32

标签: c# winforms command-line

我对编码很新,但已经构建了一些小东西。我在上一个项目中想到的一件事是如何运行通常从控制台运行的2个简单命令,而不是从表单应用程序中运行。简单地说,表单有2个按钮,单击一个按钮导致ipconfig运行,另一个ipconfig /all。然后它将来自命令的ip信息发布到我创建的另一个表单中作为消息框。这很重要,因为我正在尝试做类似的事情,现在没有任何工作。

我有一个表格,其中包含用户名和密码点。提交时,我希望它基本上运行以下内容:

NET USE F: \\ALPHA\CLIENTAPPS /user:domain\%username% %password% /persistent:no
NET USE O: \\ALPHA\USERS /user:domain\%username% %password% /persistent:no
NET USE S: \\ALPHA\COMPANY /user:domain\%username% %password% /persistent:no

从表单和域中捕获%username%%password%的位置将是我们的实际域名。

使用与前面提到的ipconfig程序类似的方法,这就是我想到的。但是,当我单击“提交”按钮时,没有任何反应,没有错误,也没有实际创建网络共享:

private void btnSubmit_Click(object sender, EventArgs e)
{
    string un = txtUsername.Text;
    string pw = txtPassword.Text;

    System.Diagnostics.ProcessStartInfo PR = new System.Diagnostics.ProcessStartInfo("cmd", @" /c net use W: \\\\ALPHA\\CLIENTAPPS /user:acsdish\\" + un + " " + pw + "/persistent:no");
    PR.RedirectStandardOutput = true;
    PR.UseShellExecute = false;
    PR.CreateNoWindow = true;
    System.Diagnostics.Process StartPR = new System.Diagnostics.Process();
    StartPR.StartInfo = PR;
    StartPR.Start();
}

我在这里缺少什么,还是有更好的方法?感谢。

麦克

2 个答案:

答案 0 :(得分:5)

System.Diagnostics.ProcessStartInfo PR = new System.Diagnostics.ProcessStartInfo("cmd", @" /c net use W: \\\\ALPHA\\CLIENTAPPS /user:acsdish\\" + un + " " + pw + "/persistent:no");

尝试删除“@”或删除“\”char

的转义

Info here(逐字字符串文字)

答案 1 :(得分:3)

  

没有任何反应,没有错误,也没有实际创建网络共享

你已经做了很多工作来确保这一点。 “没有错误”很容易解释,你没有检查是否有错误,也没有为用户提供查看的方法,因为你确保了控制台窗口不可见。如果命令失败,则它将不可见。检查Process.ExitCode是一个最低要求。

接下来的缺陷是您为特定用户创建了共享的映射。哪个好,驱动器映射是按用户设置。但是您实际上并未以该用户身份登录,因此您无法查看这些映射。您必须按Ctrl + Alt + Del并切换用户帐户。但这是一个失败的原因,因为你通过/持久:没有。这意味着“在用户登录时持久”。

最终的缺陷是你将它留给另一个处理它的过程。这总会丢失关键信息,特别是错误。你应该调整执行此操作的Windows api函数,以便在知道时它不起作用,并且不会烧掉大量的周期来运行另一个进程。 Pinvoke WNetAddConnection2()。