2016-10-28 12 views
0

このCMDコマンドを実行してDNSを変更しようとしていますが、動作していません。私は何の誤りもありません。しかし、それは動作しませんが、管理者として実行するように求めています。引数を使用してCMDを実行していません

手動でCMDに引数を入力すると機能します。ここで

は私のコードです:

System.Diagnostics.ProcessStartInfo myProcessInfo = new System.Diagnostics.ProcessStartInfo(); 
myProcessInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") + @"\System32\cmd.exe"; 
myProcessInfo.Arguments = "set DNS1=198.168.97.1 " + 
    "set DNS2=5.2.2.2 " + 
    "set DNS3=206.19.29.17 " + 
    "set INTERFACE=Ethernet " + 
    "netsh int ipv4 set dns name='%INTERFACE%' static %DNS1% primary validate=no " + 
    "netsh int ipv4 add dns name='%INTERFACE%' %DNS2% index=2 " + 
    "netsh int ipv4 add dns name='%INTERFACE%' %DNS3% index=3" + 
    "ipconfig /flushdns"; 

myProcessInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
myProcessInfo.Verb = "runas"; 
System.Diagnostics.Process.Start(myProcessInfo); 
+0

これらがひとつずつ実行(またはバッチファイルに入れをし、それを実行)するには、3つの別々のコマンドであり、あなたドン何も設定する必要はありません。なぜなら、セットの値をnetshの中に直接入力することができるからです。また、CMD.EXEプロセッサを起動するときには、引数/ Kまたは/ Cを引数の前につけてください。 – Steve

+0

コマンドを区切るのに '' && ''を使ってみることもできます。コマンドセパレータ '' && ''で区切られた複数のコマンドは、引用符で囲まれた文字列に対して受け入れられることに注意してください。 – Darek

+0

@Darekあなたはそれがうまくいくと思いますか? –

答えて

1

は実際にあなたが何をしているか、通常の引数として、すべてのコマンドが追加されます。 1つのコマンドごとにコマンドラインを実行するか、またはコマンド間に&シンボルを追加してチェーンします。また、コマンドを渡すには/c - 引数を使用する必要があります。だからあなたのコードは次のようになります。

myProcessInfo.Arguments = "/c 'set DNS1=198.168.97.1 && " + 
            "set DNS2=5.2.2.2 && " + 
            "set DNS3=206.19.29.17 && " + 
            "set INTERFACE=Ethernet && " + 
            "netsh int ipv4 set dns name='%INTERFACE%' static %DNS1% primary validate=no && " + 
            "netsh int ipv4 add dns name='%INTERFACE%' %DNS2% index=2 && " + 
            "netsh int ipv4 add dns name='%INTERFACE%' %DNS3% index=3 && " + 
            "ipconfig /flushdns'"; 
+0

ありがとうが、これはまだ動作しませんでした。それはDNSを変更しませんでした。 –

+0

通常のコマンドラインで動作するかどうか確認できますか?私は現在Windowsデバイス上にないので、これは前提に基づいています。 – NikxDa

+0

はい通常のCMDコマンドラインで動作します@NikxDa –

0

をおそらく、このような何か:

var tempFileName = Path.GetTempFileName() + ".cmd"; 
File.WriteAllLines(tempFileName, new[] 
{ 
    "set DNS1=198.168.97.1 ", 
    "set DNS2=5.2.2.2 ", 
    "set DNS3=206.19.29.17 ", 
    "set INTERFACE=Ethernet ", 
    "netsh int ipv4 set dns name='%INTERFACE%' static %DNS1% primary validate=no ", 
    "netsh int ipv4 add dns name='%INTERFACE%' %DNS2% index=2 ", 
    "netsh int ipv4 add dns name='%INTERFACE%' %DNS3% index=3", 
    "ipconfig /flushdns" 
}); 

var myProcessInfo = new ProcessStartInfo(); 
myProcessInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") 
    + @"\System32\cmd.exe /C " + tempFileName; 
myProcessInfo.WindowStyle = ProcessWindowStyle.Hidden; 
myProcessInfo.Verb = "runas"; 
var myProcess = Process.Start(myProcessInfo); 
if (myProcess != null) 
    while (!myProcess.HasExited) 
    { 
     myProcess.Refresh(); 
     Thread.Sleep(TimeSpan.FromSeconds(1)); 
    } 
File.Delete(tempFileName); 
+0

神様、これはひどいです。配列の考え方はそれほど悪くはありませんが、ファイルに書き込むことなく、少なくともすべてのコマンドを実行してください。ファイルに書き込むことは、多くの不必要なオーバーヘッドをもたらす。 – NikxDa

+0

1行ごとに実行することは意味がありません。すべてのセットはそれ自身の状況になります。 '' && ''やバッチファイルで1行として実行する必要があります。私はコマンドラインを無期限に拡張することに自信がない、限界がある。 – Darek

+0

申し訳ありませんが、私はそれを見ることができませんでした。この場合、このソリューションは確かに大丈夫ですが、私は上記のソリューションを好むでしょう。私は個人的に配列を渡すことができる連鎖関数を書いて、有効なcmd引数を返します。 – NikxDa