此操作类主要使用了系统命令行来实现的,详细的命令可参照微软文档《如何使用"netsh advfirewall firewall"上下文而非“netsh firewall”上下文来控制 Windows Server 2008 和 Windows Vista 中的 Windows 防火墙行为》,而检查端口部分则利用Socket判断端口是否被占用,但是在也会有判断失灵的时候。

     public static class PortHelper
{
#region 命令原型
//netsh firewall delete allowedprogram [AppPath] //netsh firewall add allowedprogram [appPath] [portName] ENABLE //netsh firewall add portopening [ALL|TCP|UDP] [portID] [portName] //netsh firewall delete portopening [ALL|TCP|UDP] [portID]
#endregion /// <summary>
/// 判定指定端口号有否被占用
/// </summary>
/// <param name="portId">端口号</param>
/// <returns></returns>
public static bool IsAvaliable(int portId)
{
bool result;
IPEndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), portId);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
socket.Bind(point);
result = true;
}
catch (Exception ex)
{
result = false;
}
finally
{
socket.Close();
socket.Dispose();
socket = null;
}
return result;
} #region 指定端口号 /// <summary>
/// 开放指定端口
/// </summary>
/// <param name="portName">端口名称</param>
/// <param name="portId">端口号</param>
/// <param name="type">协议类型</param>
/// <returns></returns>
public static bool OpenPortByID(string portName, int portId,ProtocolTypeName type)
{
string arg = string.Format("firewall add portopening {0} {1} {2}", type, portId, portName);
string cmdResult = RunCMD("netsh", arg);
if (cmdResult.Contains("确定"))
return true;
return false;
} /// <summary>
/// 开放指定的所有类型端口
/// </summary>
/// <param name="portName">端口名称</param>
/// <param name="portId">端口号</param>
/// <returns></returns>
public static bool OpenPortByID(string portName, int portId)
{
return OpenPortByID(portName, portId, ProtocolTypeName.ALL);
} /// <summary>
/// 删除指定的所有类型端口
/// </summary>
/// <param name="portId">端口号</param>
/// <returns></returns>
public static bool DeletePortByID(int portId)
{
return DeletePortByID(portId, ProtocolTypeName.ALL);
} /// <summary>
/// 删除指定的端口
/// </summary>
/// <param name="portId">端口号</param>
/// <param name="type">协议类型</param>
/// <returns></returns>
public static bool DeletePortByID(int portId, ProtocolTypeName type)
{
string arg = string.Format("firewall delete portopening {0} {1}", type, portId);
string cmdResult = RunCMD("netsh", arg);
if (cmdResult.Contains("确定"))
return true;
return false;
} #endregion #region 指定应用程序 /// <summary>
/// 为指定应用程序开放端口
/// </summary>
/// <param name="appPath">应用程序路径</param>
/// <param name="portName">端口名称</param>
/// <returns></returns>
public static bool OpenPortAppName(string appPath,string portName)
{
string arg = string.Format("firewall add allowedprogram {0} {1} ENABLE",appPath,portName);
string cmdResult = RunCMD("netsh", arg);
if (cmdResult.Contains("确定"))
return true;
return false;
} /// <summary>
/// 删除指定应用程序的端口
/// </summary>
/// <param name="appPath">应用程序路径</param>
/// <returns></returns>
public static bool DeletePortByAppName(string appPath)
{
string arg = string.Format("firewall delete allowedprogram {0}",appPath);
string cmdResult = RunCMD("netsh", arg);
if (cmdResult.Contains("确定"))
return true;
return false;
} #endregion /// <summary>
/// 执行命令
/// </summary>
/// <param name="cmd">命令名称</param>
/// <param name="arg">参数</param>
/// <returns></returns>
private static string RunCMD(string cmd, string arg)
{
Process pro = new Process();
pro.StartInfo = new ProcessStartInfo(cmd, arg);
pro.StartInfo.UseShellExecute = false;
pro.StartInfo.RedirectStandardOutput = true;
pro.Start();
pro.WaitForExit();
string outputText = pro.StandardOutput.ReadToEnd();
return outputText;
}
} public enum ProtocolTypeName
{
ALL,
TCP,
UDP
}

一个端口操作类PortHelper的更多相关文章

  1. 一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER

    最近做了一个数据诊断的项目,里面自己写了一个数据库的操作类,包含:连接数据库.读数据表.执行SQL操作,释放数据库等组成,希望对大家有用,由于水平有限,若有错误或者代码不足地方欢迎指正,谢谢. ADO ...

  2. 51)PHP,一个数据库操作类的代码

    <?php //类名,也习惯上(推荐)使用跟文件名相似的名字 //定义一个mysql连接类,该类可以连接mysql数据库 //并实现其单例模式 //该类的功能还能够完成如下基本mysql操作: ...

  3. Java-编写一个jdbc操作类

    1.通过读取文件配置 package 数据库操作类; /* * Db.java Created on 2007年8月20日, 上午 8:37 */ import java.io.*; import j ...

  4. 封装一个redis操作类来操作hash格式

    最近项目要用redis,依然是基于tp3.2. 发现thinkphp3.2自带的缓存类并不好使用,就自己封装了一个 目前只支持hash格式,其他数据类型的操作后面用到的时候再补充 <?php / ...

  5. C#封装的一个JSON操作类

    using System; using System.Collections.Generic; using System.Collections; using System.Text; using S ...

  6. vba的一个File操作类

    Option Explicit '-------------------------------------------------------- '[Class name]: clsTxtFile ...

  7. vba的一个DB操作类

    Option Explicit '-------------------------------------------------------- '[Class Name]: DBHelper '[ ...

  8. Android打造属于自己的数据库操作类。

    1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...

  9. XML Helper XML操作类

    写的一个XML操作类,包括读取/插入/修改/删除. using System;using System.Data;using System.Configuration;using System.Web ...

随机推荐

  1. TextView使用SpannableString设置复合文本(转)

    TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能: 1.Bac ...

  2. Android开发:第四日番外——Assets文件夹和RAW文件夹区别

    话说上回说到SQLite数据库,其中涉及到把已经设计好的数据库打包到APK中,提到可以放置在Assert文件夹或者RAW文件夹中,那么两者到底有什么区别呢?让我们来探究一下. 一.res/raw和as ...

  3. [Scheme]Understanding the Yin-Yang Puzzle

    这题目确实比较杀脑细胞... 原题: (let* ((yin ((lambda (cc) (display "@") cc) (call-with-current-continua ...

  4. 文件系统管理 之 Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍

    一.df 命令:df 是来自于coreutils 软件包,系统安装时,就自带的:我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置: 举例: [root@localhost beinan] ...

  5. JPA与Hibernate的关系

    1.JPA JPA全称: Java Persistence API  JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.  JPA的出现?  JPA ...

  6. JavaScriptSerializer 中的匿名类型 转json

    二:JavaScriptSerializer 中的匿名类型 这个类型我想大家都清楚,不过性能更高的方式应该是用JsonConvert吧,但这个不是本篇讨论的话题,我们重点来看看匿名类型的Json序列化 ...

  7. hexdump—Linux系统的二进制文件查看工具

    hexdump 无参: 相当于 hexdump -x 0000000 457f 464c 0102 0001 0000 0000 0000 0000 0000010 0002 003e 0001 00 ...

  8. 查询反模式 - GroupBy、HAVING的理解

    为了最简单地说明问题,我特地设计了一张这样的表. 一.GROUP BY单值规则 规则1:单值规则,跟在SELECT后面的列表,对于每个分组来说,必须返回且仅仅返回一个值. 典型的表现就是跟在SELEC ...

  9. Python--Cmd窗口运行Python时提示Fatal Python error: Py_Initialize: can't initialize sys standard streams LookupError: unknown encoding: cp65001

    源地址连接: http://www.tuicool.com/articles/ryuaUze 最近,我在把一个 Python 2 的视频下载工具 youku-lixian 改写成 Python 3,并 ...

  10. Windows Phone 8.1 Update1 支持中文“小娜”及开发者模拟器更新

    千呼万唤的 Windows Phone 8.1 Update1 在 developer Perview 发布了还没有升级的朋友随我先睹为快吧.升级了的朋友们来看看 WP8.1 update1 还有哪些 ...