【问题标题】:Check if a port is assigned to any program or added in firewall - C#检查端口是否分配给任何程序或添加到防火墙中 - C#
【发布时间】:2011-09-22 07:54:36
【问题描述】:

我们有将由安装程序安装的 Windows 服务。我们有一个选项允许用户提供端口号并选择服务是否必须在安装完成后启动。我们正在检查安装程序本身以检查端口是否打开/可用。

TcpClient TcpScan = new TcpClient();
TcpScan.Connect("localhost", portno);
if (TcpScan.Connected == true)
{
   TcpScan.Close();
}

我的问题是,如果用户选择在安装时不启动服务的选项,然后我们在同一台机器上安装另一个实例,其端口与第一个实例中使用的相同,那么如果我们同时启动这两个服务,那么其中一个该服务将不起作用。

那么有什么方法可以检查用户提供的端口是否已经存在于防火墙中或是否已分配给其他一些 Windows 服务? (同时假设服务可以处于停止状态)

【问题讨论】:

    标签: c# windows-services port


    【解决方案1】:

    我认为不会,因为任何应用程序都可以在运行时打开端口。
    您可以(例如)使用Mutex 来避免在同一端口上出现多个服务实例(给互斥锁取一个类似String.Format(MyMutex_{0},my_port} 的名称。
    您可以/应该在服务启动期间检查该端口是否空闲,如果不是,则优雅地关闭它。

    【讨论】:

      【解决方案2】:

      做了一些研发终于得到了答案

      string OP = @"C:\Windows\Temp\ExceptionList.txt";
      
      ProcessStartInfo procStartInfo = null;
      
      string command = "netsh advfirewall firewall show rule name=all > " + OP;
      procStartInfo = new ProcessStartInfo("cmd", "/c " + command);
      
      procStartInfo.CreateNoWindow = true;
      procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
      
      System.Diagnostics.Process proc = new System.Diagnostics.Process();
      proc.StartInfo = procStartInfo;
      proc.Start();
      proc.WaitForExit();
      
      if (File.Exists(OP))
      {
          StreamReader SR = new StreamReader(OP);
          string FileData = SR.ReadToEnd();
          SR.Close();
      
          //Logic to read the output and then fetch only records which are enabled and have LocalPort
      }
      

      输出 (ExceptionList.txt) 文件包含此格式的数据

      Rule Name:                            NETTCP
      ---------------------------------------------
      Enabled:                              Yes
      Direction:                            In
      Profiles:                             Domain
      Grouping:                             
      LocalIP:                              Any
      RemoteIP:                             Any
      Protocol:                             TCP
      LocalPort:                            8080
      RemotePort:                           Any
      Edge traversal:                       No
      Action:                               Allow
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-14
        • 2012-02-14
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 2015-01-02
        相关资源
        最近更新 更多