Come si ottiene il nome del processo di una porta aperta in C#?Come posso ottenere il nome del processo di una porta aperta in C#?
risposta
http://www.codeproject.com/KB/IP/iphlpapi.aspx potrebbe anche aiutare
È possibile eseguire netstat -anb
e elaborare l'output.
Ho avuto questo stesso problema non molto tempo fa. Non esiste un modo semplice per farlo usando .net da solo. Si recuperano i numeri di porta e l'ID del processo ma non la relazione tra i due.
Questo bit di codice utilizza NetStat per risolverlo.
Diventa porte attive e nomi di processo associato In C#
http://www.cheynewallace.com/get-active-ports-and-associated-process-names-in-c/
Dopo qualche ricerca, ho adattato la soluzione di Cheyne Wallace in una classe statica con una proprietà che restituisce una mappatura dei processi alle porte nel forma di un elenco utilizzando NetStat.
Ecco la classe:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
namespace MyNamespace
{
/// <summary>
/// Static class that returns the list of processes and the ports those processes use.
/// </summary>
public static class ProcessPorts
{
/// <summary>
/// A list of ProcesesPorts that contain the mapping of processes and the ports that the process uses.
/// </summary>
public static List<ProcessPort> ProcessPortMap
{
get
{
return GetNetStatPorts();
}
}
/// <summary>
/// This method distills the output from netstat -a -n -o into a list of ProcessPorts that provide a mapping between
/// the process (name and id) and the ports that the process is using.
/// </summary>
/// <returns></returns>
private static List<ProcessPort> GetNetStatPorts()
{
List<ProcessPort> ProcessPorts = new List<ProcessPort>();
try
{
using (Process Proc = new Process())
{
ProcessStartInfo StartInfo = new ProcessStartInfo();
StartInfo.FileName = "netstat.exe";
StartInfo.Arguments = "-a -n -o";
StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
StartInfo.UseShellExecute = false;
StartInfo.RedirectStandardInput = true;
StartInfo.RedirectStandardOutput = true;
StartInfo.RedirectStandardError = true;
Proc.StartInfo = StartInfo;
Proc.Start();
StreamReader StandardOutput = Proc.StandardOutput;
StreamReader StandardError = Proc.StandardError;
string NetStatContent = StandardOutput.ReadToEnd() + StandardError.ReadToEnd();
string NetStatExitStatus = Proc.ExitCode.ToString();
if (NetStatExitStatus != "0")
{
Console.WriteLine("NetStat command failed. This may require elevated permissions.");
}
string[] NetStatRows = Regex.Split(NetStatContent, "\r\n");
foreach (string NetStatRow in NetStatRows)
{
string[] Tokens = Regex.Split(NetStatRow, "\\s+");
if (Tokens.Length > 4 && (Tokens[1].Equals("UDP") || Tokens[1].Equals("TCP")))
{
string IpAddress = Regex.Replace(Tokens[2], @"\[(.*?)\]", "1.1.1.1");
try
{
ProcessPorts.Add(new ProcessPort(
Tokens[1] == "UDP" ? GetProcessName(Convert.ToInt16(Tokens[4])) : GetProcessName(Convert.ToInt16(Tokens[5])),
Tokens[1] == "UDP" ? Convert.ToInt16(Tokens[4]) : Convert.ToInt16(Tokens[5]),
IpAddress.Contains("1.1.1.1") ? String.Format("{0}v6", Tokens[1]) : String.Format("{0}v4", Tokens[1]),
Convert.ToInt32(IpAddress.Split(':')[1])
));
}
catch
{
Console.WriteLine("Could not convert the following NetStat row to a Process to Port mapping.");
Console.WriteLine(NetStatRow);
}
}
else
{
if (!NetStatRow.Trim().StartsWith("Proto") && !NetStatRow.Trim().StartsWith("Active") && !String.IsNullOrWhiteSpace(NetStatRow))
{
Console.WriteLine("Unrecognized NetStat row to a Process to Port mapping.");
Console.WriteLine(NetStatRow);
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return ProcessPorts;
}
/// <summary>
/// Private method that handles pulling the process name (if one exists) from the process id.
/// </summary>
/// <param name="ProcessId"></param>
/// <returns></returns>
private static string GetProcessName(int ProcessId)
{
string procName = "UNKNOWN";
try
{
procName = Process.GetProcessById(ProcessId).ProcessName;
}
catch { }
return procName;
}
}
/// <summary>
/// A mapping for processes to ports and ports to processes that are being used in the system.
/// </summary>
public class ProcessPort
{
private string _ProcessName = String.Empty;
private int _ProcessId = 0;
private string _Protocol = String.Empty;
private int _PortNumber = 0;
/// <summary>
/// Internal constructor to initialize the mapping of process to port.
/// </summary>
/// <param name="ProcessName">Name of process to be </param>
/// <param name="ProcessId"></param>
/// <param name="Protocol"></param>
/// <param name="PortNumber"></param>
internal ProcessPort (string ProcessName, int ProcessId, string Protocol, int PortNumber)
{
_ProcessName = ProcessName;
_ProcessId = ProcessId;
_Protocol = Protocol;
_PortNumber = PortNumber;
}
public string ProcessPortDescription
{
get
{
return String.Format("{0} ({1} port {2} pid {3})", _ProcessName, _Protocol, _PortNumber, _ProcessId);
}
}
public string ProcessName
{
get { return _ProcessName; }
}
public int ProcessId
{
get { return _ProcessId; }
}
public string Protocol
{
get { return _Protocol; }
}
public int PortNumber
{
get { return _PortNumber; }
}
}
}
Chiamata da una semplice applicazione console può apparire come:
using System;
namespace MyNamespace
{
class Program
{
static void Main(string[] args)
{
foreach (ProcessPort p in ProcessPorts.ProcessPortMap.FindAll(x => x.ProcessName.ToLower() == "myprocess")) //extension is not needed.
{
Console.WriteLine(p.ProcessPortDescription);
}
foreach (ProcessPort p in ProcessPorts.ProcessPortMap.FindAll(x => x.PortNumber == 4444))
{
Console.WriteLine(p.ProcessPortDescription);
}
Console.WriteLine("Press any key to continue...");
Console.ReadLine();
}
}
}
ID di processo sono Int32, non Int16 :) – Nuzzolilo
- 1. Come ottenere il nome del processo in C++
- 2. Modificare il nome del processo in C#?
- 3. Come ottenere l'ID del processo dal nome del processo?
- 4. Come posso ottenere il nome del computer locale in C#?
- 5. Win32API - Come ottenere il nome del file del processo dall'handle del processo?
- 6. Come posso ottenere un handle di processo con il suo nome in C++?
- 7. Come ottenere il nome del processo di un'applicazione?
- 8. Come aspettare una porta aperta con netcat?
- 9. Come ottenere il PID del processo specificando il nome del processo e memorizzandolo in una variabile da utilizzare ulteriormente?
- 10. Cambia il nome del processo reale in C su Linux
- 11. Ruby: verifica se una porta è aperta
- 12. Come ottenere il nome del mese in C#?
- 13. Ottieni il nome del processo tramite PID
- 14. Come posso ottenere il nome del pacchetto in Android?
- 15. Come posso ottenere il nome del programma in Racket?
- 16. Come ottenere solo l'ID di processo nel nome del processo specificato in linux?
- 17. Come posso ottenere il nome di una collectionviewcell selezionata?
- 18. C# - Uccidere un processo da una parte del suo nome
- 19. Ottieni il numero di porta per il nome del servizio?
- 20. Trovare la porta TCP aperta in una rete
- 21. Come ottenere l'handle della finestra dando il nome del processo in esecuzione?
- 22. Determinare il processo PID in ascolto su una determinata porta
- 23. Trova PID del processo che utilizzano una porta su Windows
- 24. Come posso ottenere il nome di una classe Ruby?
- 25. Come ottenere il nome utente in C/C++ in Linux?
- 26. Il nome del processo è sempre il nome dell'exe?
- 27. Come posso ottenere il parametro del nome f.submit nel controller?
- 28. Come posso sapere se ho inviato un pacchetto UDP a una porta aperta?
- 29. Come posso ottenere il nome e il cognome come nome completo in una query MYSQL?
- 30. Come impostare il nome del processo eseguibile del progetto?
altre idee ... attraverso le API .NET o Win32 –