1

我对编码相当陌生,但已经构建了一些小东西。我在上一个项目中发现的一件事是如何运行通常从控制台运行的 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();
}

我在这里错过了什么,还是有更好的方法?谢谢。

麦克风

4

2 回答 2

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

尝试删除“@”或删除“\”字符的转义

此处的信息(逐字字符串文字)

于 2012-08-09T21:47:20.853 回答
3

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

你已经做了很多来确保这一点。“没有错误”很容易解释,您不会检查错误,也不会让用户看到它们,因为您确保控制台窗口不可见。如果命令失败,它将不可见。检查 Process.ExitCode 是最低要求。

下一个缺陷是您为特定用户创建到共享的映射。这很好,驱动器映射是每个用户的设置。但是您实际上并未以该用户身份登录,因此您看不到这些映射。您必须按 Ctrl+Alt+Del 并切换用户帐户。但这是一个失败的原因,因为您通过了 /persistent:no。这意味着“在用户登录时持续存在”。

Ultimate flaw is that you leave it up to an another process to take care of it. That always loses critical information, especially errors. You should pinvoke the Windows api function that does this so you know when it doesn't work and don't burn a gazillion cycles to run another process. Pinvoke WNetAddConnection2().

于 2012-08-09T22:16:32.040 回答