Как проанализировать вывод netstat в текстовый файл и получить все удаленные IP-адреса как переменные в соответствии с PID? - PullRequest
0 голосов
/ 27 сентября 2019

Справочная информация

Настольное WPF-приложение, которое мне требуется для кодирования, позволяет мне выбирать процессы / приложения, запущенные в настоящее время на локальном компьютере, получать имя приложения и PID и сохранять его вПеременная.Каждый раз, когда приложение загружается после того, как пользователь нажимает кнопку после выбора процесса, выполняется netstat -ano > C:\test.txt.

Задача

Есть ли способ кодировать его такчто имя приложения и PID, которые были получены ранее, можно сравнить со строкой соответствующего PID в файле test.txt, а затем сохранить удаленный IP-адрес в переменной (ях) или массиве?Благодарю.

1 Ответ

0 голосов
/ 27 сентября 2019

Зачем вообще текстовый файл?Вот как я мог бы решить эту проблему, используя DataTable для хранения и сбора данных:

        //Create the process
        using (Process ns = new Process())
        {

            DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[] {
                    new DataColumn("Protocol"),
                    new DataColumn("Local Address"),
                    new DataColumn("Foreign Address"),
                    new DataColumn("State"),
                    new DataColumn("PID"),
                    new DataColumn("Process Name"),
                });

            ProcessStartInfo psi = new ProcessStartInfo("netstat.exe", "-ano");
            psi.RedirectStandardOutput = true;
            psi.UseShellExecute = false;
            ns.StartInfo = psi;
            // Run it, and read the results
            ns.Start();
            using (StreamReader r = ns.StandardOutput)
            {
                string output = r.ReadToEnd();
                ns.WaitForExit();

                //Parse those results into a DataTable, polling the Process info
                string[] lines = output.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);


                foreach (string line in lines)
                {
                    string[] elements = line.Split(' ');
                    if (elements.Length < 5) continue;
                    if (elements.Contains("Proto")) continue;

                    DataRow dr = dt.NewRow();

                    List<string> validElements = new List<string>();

                    //Weed out empty elements.
                    foreach (string element in elements)
                    {
                        //skip blanks
                        if (element.Trim() == "") continue;
                        validElements.Add(element);
                    }

                    foreach (string element in validElements)
                    {

                        foreach (DataColumn dc in dt.Columns)
                        {
                            // fill in the buckets. Note that UDP doesn't have a state
                            if (dr["Protocol"].ToString() == "UDP" && dc.ColumnName == "State") continue;

                            if (dr[dc] == DBNull.Value)
                            {
                                dr[dc] = element;
                                break;
                            }
                        }
                    }

                    dr["Process Name"] = Process.GetProcessById(int.Parse(dr["PID"].ToString())).ProcessName;
                    dt.Rows.Add(dr);
                }
            }
        }

И вот небольшой скриншот моих результирующих данных:

enter image description here

Тогда я могу делать все, что захочу, в коде с этими данными.Вот как бы я это сделал, по крайней мере.

...