1

私はコーディングにかなり慣れていませんが、いくつかの小さなものを構築しました。前回のプロジェクトでわかったことの 1 つは、通常はコンソールから実行される 2 つの単純なコマンドを、代わりにフォーム アプリケーション内から実行する方法でした。簡単に言えば、フォームには2つのボタンがあり、1つをクリックするipconfigと実行され、もう1つは実行されました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 を渡したので、それは失われた原因です。これは、「ユーザーがログインしている間持続する」ことを意味します。

究極の欠陥は、それを処理するために別のプロセスに任せることです。それは常に重要な情報、特にエラーを失います。これを行う Windows api 関数をピンボークする必要があります。これにより、いつ機能しないかがわかるようになり、別のプロセスを実行するために膨大なサイクルを消費しないようにすることができます。WNetAddConnection2() をピンボークします。

于 2012-08-09T22:16:32.040 に答える