使用C#捕获nslookup命令的输出结果

7

我希望能够在C#中自动化并捕获命令行进程。

在命令行中,我输入以下内容:

nslookup

这将启动一个 shell,它会给我一个 > 提示符。在提示符下,我输入:
ls -a mydomain.local

这将返回我的主DNS服务器上本地CNAME列表及其所附加的物理机器。
我想要做的是从C#自动化这个过程。如果这是一个简单的命令,我会使用Process.StartInfo.RedirectStandardOutput = true,但第二步的要求使我遇到了困难。
3个回答

7
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. 

这确实让我朝着正确的方向前进了。最终,我使用异步读取和事件来使其按照广告所述工作,因为StandardOutput.ReadToEnd()每次都会冻结,.WaitForExit()也是如此。 - Yes - that Jake.
是的,那一部分确实有点棘手。我把它留给你了,因为我不太清楚你想如何使用输出。 - Mehrdad Afshari
关于异步读取,这可能是一个真正的问题。在我的应用程序中,我使用了从这个博客文章中找到的示例代码进行了修改。 - Daniel Pryden
4
еңЁ.NET 4дёӯпјҢжӮЁйңҖиҰҒдҪҝз”ЁProcess nslookup = Process.Start(si);гҖӮж„ҸжҖқжҳҜеҗҜеҠЁдёҖдёӘиҝӣзЁӢжқҘиҝҗиЎҢnslookupе‘Ҫд»ӨгҖӮ - Greg Bray
@GregBray 这在 .NET Framework 4 客户端配置文件中不起作用 :/ - Kaitlyn

2

虽然不是你要求的内容,但我曾经写过一个应用程序,可以实现你正在做的事情。最终,我使用了一个.NET库来进行DNS查找,结果速度更快。

我相当确定我使用了CodeProject网站上的这个库


1

我知道这是一个老问题,但仍然想做出贡献。 我使用“NsLookup Hostname Server”的 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;
        }
    }


}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接