使用C#捕获nslookup shell输出

我有一个命令行过程,我想在C#中自动化和捕获。

在命令行中,我输入:

nslookup 

这会启动一个shell,它会给我一个>提示符。 在提示符下,我输入:

 ls -a mydomain.local 

这将返回主DNS服务器及其附加的物理机的本地CNAME列表。

我想做的是从C#自动化这个过程。 如果这是一个简单的命令,我只会使用Process.StartInfo.RedirectStandardOutput = true,但第二步的要求正在绊倒我。

 ProcessStartInfo si = new ProcessStartInfo("nslookup"); si.RedirectStandardInput = true; si.RedirectStandardOutput = true; Process nslookup = new Process(si); nslookup.Start(); nslookup.StandardInput.WriteLine("ls -a mydomain.local"); nslookup.StandardInput.Flush(); // use nslookup.StandardOutput stream to read the result. 

不是你问的,但我曾经写过一个应用程序来做你正在做的事情。 我最终转向使用.NET库来进行DNS查找,结果发现速度要快得多。

我很确定我在CodeProject网站上使用了这个库 。

我知道这是一个旧的,但仍然愿意贡献。 我使用“NsLookup主机名服务器”的shell输出从我们域中的计算机名获取IPv4地址,并删除任何其他信息,如DNS服务器/ ipv6地址..

这有点快速完成,但它可以工作,如果shell失败,你还会使用C#中内置的nslookup方法添加故障转移。

它相当长但它让我有可能从shell中读取ipv4而不使用外部库或不使用内置的nslookup函数,因为它允许选择dns服务器。

如果你想知道中间的if循环,可能会有更优雅的解决方案,但是对于我个人使用,这很好,我们域中的大多数主机返回2 ipv6和2 ipv4,因此,它测试多达4次。

希望这可以帮助..

  private void button1_Click(object sender, EventArgs e) { IPAddress[] ips = NsLookup(computername, dnsserver); txtResult.Text = string.Empty; if (ips != null) { txtResult.Text = ips[0].ToString(); txtResult.Text += Environment.NewLine; if (ips[1] != null) { txtResult.Text += ips[1].ToString(); } else { } } else { txtResult.Text = "No IP found"; } } public IPAddress[] NsLookup(string computername, string domaincontroller) { IPAddress[] ips = new IPAddress[2]; try { // Creating streamreaders to read the output and the errors StreamReader outputReader = null; StreamReader errorReader = null; string nslookup = @"C:\Windows\System32\Nslookup.exe"; try { // Setting process startupinfo ProcessStartInfo processStartInfo = new ProcessStartInfo(nslookup, computername + " " + domaincontroller); processStartInfo.ErrorDialog = false; processStartInfo.UseShellExecute = false; processStartInfo.RedirectStandardError = true; processStartInfo.RedirectStandardInput = true; processStartInfo.RedirectStandardOutput = true; processStartInfo.WindowStyle = ProcessWindowStyle.Minimized; // Starting Process Process process = new Process(); process.StartInfo = processStartInfo; bool processStarted = process.Start(); if (processStarted) { // Catching the output streams outputReader = process.StandardOutput; errorReader = process.StandardError; string errorresult = errorReader.ReadLine(); errorReader.Close(); if (errorresult != null) { // Failure got thrown in NsLookup Streamreading, try build-in Method try { ips = Dns.GetHostAddresses(computername); return ips; } catch { return null; } } else { // Clearing out all the values before the addresses. outputReader.ReadLine(); outputReader.ReadLine(); outputReader.ReadLine(); outputReader.ReadLine(); // Reading and Verifying the first outputline (the address is found after "Addresses: ") - 2 part of the array is taken (after second space) string outputline = outputReader.ReadLine(); string[] outputlineaftersplit = outputline.Split(' '); string ipfortesting = outputlineaftersplit[2].Trim(); if (verifyIP(ipfortesting) != null) // First entry is ipv4 { ips[0] = verifyIP(ipfortesting); outputline = outputReader.ReadLine(); ipfortesting = outputline.Trim(); if (verifyIP(ipfortesting) != null) // First and second entry are ipv4 { ips[1] = verifyIP(ipfortesting); return ips; } else { return ips; } } else { outputline = outputReader.ReadLine(); ipfortesting = outputline.Trim(); if (verifyIP(ipfortesting) != null) { ips[0] = verifyIP(ipfortesting); outputline = outputReader.ReadLine(); ipfortesting = outputline.Trim(); if (verifyIP(ipfortesting) != null) { ips[0] = verifyIP(ipfortesting); outputline = outputReader.ReadLine(); ipfortesting = outputline.Trim(); if (verifyIP(ipfortesting) != null) { ips[1] = verifyIP(ipfortesting); return ips; } else { return ips; } } else { return ips; } } else { outputline = outputReader.ReadLine(); ipfortesting = outputline.Trim(); if (verifyIP(ipfortesting) != null) { ips[0] = verifyIP(ipfortesting); outputline = outputReader.ReadToEnd(); ipfortesting = outputline.Trim(); if (verifyIP(ipfortesting) != null) { ips[1] = verifyIP(ipfortesting); return ips; } else { return ips; } } else { ips = null; return ips; } } } } } else { // Failure got thrown in NsLookup Streamreading, try build-in Method try { ips = Dns.GetHostAddresses(computername); return ips; } catch { return null; } } } catch { System.Windows.Forms.MessageBox.Show("ERROR 1"); // Failure got thrown in NsLookup Streamreading, try build-in Method try { ips = Dns.GetHostAddresses(computername); return ips; } catch { return null; } } finally { if (outputReader != null) { outputReader.Close(); } } } catch { System.Windows.Forms.MessageBox.Show("ERROR 2"); // Failure got thrown in NsLookup Streamreading, try build-in Method try { ips = Dns.GetHostAddresses(computername); return ips; } catch { return null; } } } public IPAddress verifyIP(string ipfromreader) { IPAddress ipresult = null; bool isIP = IPAddress.TryParse(ipfromreader, out ipresult); if (isIP && (ipresult.AddressFamily != AddressFamily.InterNetworkV6)) { return ipresult; } else { return null; } } } 

}