22 / 12 / 15

C#获取windows占用端口进程信息

参考链接:链接1

获取占用端口进程列表(cmd获取命令结果字符串进行解析)

public static DataTable GetProcessPorts2()
{
    DataTable dtportinfo = new DataTable();
    dtportinfo.Columns.Add("pid", typeof(int));
    dtportinfo.Columns.Add("name");
    dtportinfo.Columns.Add("port_count", typeof(int));
    dtportinfo.Columns.Add("ports");
    dtportinfo.PrimaryKey = new DataColumn[] { dtportinfo.Columns["pid"] };
    Dictionary<int, List<int>> portinfo = null;
    //存放进程使用的端口号链表
    //List<int> ports = new List<int>();
    try
    {
        portinfo = new Dictionary<int, List<int>>();
        Process pro = new Process();
        pro.StartInfo.FileName = "cmd.exe";
        pro.StartInfo.UseShellExecute = false;
        pro.StartInfo.RedirectStandardInput = true;
        pro.StartInfo.RedirectStandardOutput = true;
        pro.StartInfo.RedirectStandardError = true;
        pro.StartInfo.CreateNoWindow = true;
        pro.Start();
        pro.StandardInput.WriteLine("netstat -ano");
        pro.StandardInput.WriteLine("exit");
        Regex reg = new Regex("\\s+", RegexOptions.Compiled);
        string line = null;
        //ports.Clear();
        while ((line = pro.StandardOutput.ReadLine()) != null)
        {
            line = line.Trim();
            if (line.StartsWith("TCP", StringComparison.OrdinalIgnoreCase))
            {
                line = reg.Replace(line, ",");
                string[] arr = line.Split(',');
                string soc = arr[1];
                int pos = soc.LastIndexOf(':');
                int pot = int.Parse(soc.Substring(pos + 1));
                int pid = int.Parse(arr[4]);
                if (portinfo.ContainsKey(pid))
                {
                    if (!portinfo[pid].Contains(pot))
                    {
                        portinfo[pid].Add(pot);
                        DataRow dr = dtportinfo.Rows.Find(pid);
                        dr["port_count"] = Convert.ToInt32(dr["port_count"].ToString()) + 1;
                        dr["ports"] = dr["ports"].ToString() + $",{pot}";
                    }
                }
                else
                {
                    List<int> ls = new List<int>();
                    ls.Add(pot);
                    portinfo.Add(pid, ls)
                    DataRow dr = dtportinfo.NewRow();
                    dr["pid"] = pid;
                    dr["port_count"] = 1;
                    dr["ports"] = $"{pot}";
                    dtportinfo.Rows.Add(dr);
                }
            }
            else if (line.StartsWith("UDP", StringComparison.OrdinalIgnoreCase))
            {
                line = reg.Replace(line, ",");
                string[] arr = line.Split(',');
                string soc = arr[1];
                int pos = soc.LastIndexOf(':');
                int pot = int.Parse(soc.Substring(pos + 1));
                int pid = int.Parse(arr[3]);
                if (portinfo.ContainsKey(pid))
                {
                    if (!portinfo[pid].Contains(pot))
                    {
                        portinfo[pid].Add(pot);
                        DataRow dr = dtportinfo.Rows.Find(pid);
                        dr["port_count"] = Convert.ToInt32(dr["port_count"].ToString()) + 1;
                        dr["ports"] = dr["ports"].ToString() + $",{pot}";
                    }
                }
                else
                {
                    List<int> ls = new List<int>();
                    ls.Add(pot);
                    portinfo.Add(pid, ls);
                    DataRow dr = dtportinfo.NewRow();
                    dr["pid"] = pid;
                    dr["port_count"] = 1;
                    dr["ports"] = $"{pot}";
                    dtportinfo.Rows.Add(dr);
                }
            }
        }
        pro.Close();
    }
    catch (Exception exp)
    {
    }
    return dtportinfo;
}

获取进程信息

Process p = Process.GetProcessById(pid);
dr["name"] = p.ProcessName;
p.Close();
Powered by Gridea