为了账号安全,请及时绑定邮箱和手机立即绑定

如何解析txt文件中的netstat输出并根据PID获取所有远程IP地址作为变量?

如何解析txt文件中的netstat输出并根据PID获取所有远程IP地址作为变量?

PHP
慕标琳琳 2024-01-20 15:39:29
背景我尝试编码所需的桌面 WPF 应用程序允许我选择当前在本地计算机上运行的进程/应用程序,并获取应用程序名称和 PID 并将其存储在变量中。每次用户在选择进程后单击按钮后加载应用程序时,netstat -ano > C:\test.txt都会执行 a。问题有没有办法对其进行编码,以便可以将之前获得的应用程序名称和 PID 与文件中匹配的 PID 行进行比较test.txt,然后将远程 IP 地址存储到变量或数组中?谢谢。
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

为什么要有一个文本文件?这是我解决问题的方法,使用 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);

                }

            }

        }

这是我的结果数据的简短屏幕截图:

https://img1.sycdn.imooc.com/65ab78d30001796506510331.jpg

然后我可以用这些数据在代码中做任何我想做的事情。至少我会这么做。



查看完整回答
反对 回复 2024-01-20
  • 1 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信