private static List GetNetStatPorts()

in Lib/Utils/Win32OpenPortListenerHelper.cs [39:131]


        private static List<ProcessPort> GetNetStatPorts()
        {
            List<ProcessPort> ProcessPorts = new List<ProcessPort>();

            try
            {
                using (Process Proc = new Process())
                {
                    ProcessStartInfo StartInfo = new ProcessStartInfo()
                    {
                        FileName = "netstat.exe",
                        Arguments = "-a -n -o",
                        WindowStyle = ProcessWindowStyle.Hidden,
                        UseShellExecute = false,
                        RedirectStandardInput = true,
                        RedirectStandardOutput = true,
                        RedirectStandardError = true
                    };

                    Proc.StartInfo = StartInfo;
                    Proc.Start();

                    StreamReader StandardOutput = Proc.StandardOutput;
                    StreamReader StandardError = Proc.StandardError;

                    string NetStatContent = StandardOutput.ReadToEnd() + StandardError.ReadToEnd();

                    if (Proc.ExitCode != 0)
                    {
                        Log.Error("Unable to run netstat.exe. Open ports will not be available.");
                        return ProcessPorts;
                    }

                    string[] NetStatRows = Regex.Split(NetStatContent, "\r\n");

                    foreach (var _outputLine in NetStatRows)
                    {
                        if (_outputLine == null)
                        {
                            continue;
                        }

                        var outputLine = _outputLine.Trim();

                        string[] Tokens = Regex.Split(outputLine, @"\s+");
                        try
                        {
                            if (Tokens.Length < 4)
                            {
                                continue;
                            }
                            string IpAddress = Regex.Replace(Tokens[1], @"\[(.*?)\]", "1.1.1.1");

                            if (Tokens.Length > 4 && Tokens[0].Equals("TCP"))
                            {
                                if (!Tokens[3].Equals("LISTENING")) { continue; }
                                ProcessPorts.Add(new ProcessPort(
                                    GetProcessName(Convert.ToInt32(Tokens[4], CultureInfo.InvariantCulture)),
                                    Convert.ToInt32(Tokens[4], CultureInfo.InvariantCulture),
                                    IpAddress.Contains("1.1.1.1") ? $"{Tokens[1]}v6" : $"{Tokens[1]}v4",
                                    Convert.ToInt32(IpAddress.Split(':')[1], CultureInfo.InvariantCulture)
                                ));
                            }
                            else if (Tokens.Length == 4 && (Tokens[0].Equals("UDP")))
                            {
                                ProcessPorts.Add(new ProcessPort(
                                    GetProcessName(Convert.ToInt32(Tokens[3], CultureInfo.InvariantCulture)),
                                    Convert.ToInt32(Tokens[3], CultureInfo.InvariantCulture),
                                    IpAddress.Contains("1.1.1.1") ? $"{Tokens[1]}v6" : $"{Tokens[1]}v4",
                                    Convert.ToInt32(IpAddress.Split(':')[1], CultureInfo.InvariantCulture)
                                ));
                            }
                            else
                            {
                                if (!outputLine.StartsWith("Proto") && !outputLine.StartsWith("Active") && !String.IsNullOrWhiteSpace(outputLine))
                                {
                                    Log.Warning("Primary Parsing error when processing netstat.exe output: {0}", outputLine);
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            Log.Warning("Secondary Parsing error when processing netstat.exe output: {0}", outputLine);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Warning("Error processing open ports: {0}", ex.Message);
            }
            return ProcessPorts;
        }