此操作类主要使用了系统命令行来实现的,详细的命令可参照微软文档《如何使用"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. 恶心的sbt 超级慢--解决

    最近在看sbt相关的资料.发现其构建仓库是用ivy和maven 相信使用过maven的人都知道下载 jar的过程十分痛苦(因为你穷,买不起VPN) 然后我们天朝本来有开源中国的maven库,后来又突然 ...

  2. selenium 3.0发布

    记得3年前selenium core team就放出风声selenium3.0将在某个圣诞节发布,然而大家等了3年,就在所有人都不再关注selenium进度的时候,selenium3.0 beta1悄 ...

  3. Oracle 数据同步系列--触发器

    现在随着项目集成的越来越深入,异构的数据多起来,数据同步的场景也用的多起来,我甚至在考虑是否忽悠用户上Oracle GoldenGate了,这样就可以不用考虑采用哪种同步方案了. 简单的介绍一下我们数 ...

  4. Firefox火狐添加书签功能失灵解决办法

    一直使用firefox,书签管理用的是插件Tabmix.感觉很好,只是不知道从那天起添加书签就不灵了!不论是Ctrl+D快捷键,还是Add Bookmark Here2插件,甚至“将此页加为书签”的菜 ...

  5. WebDriver基本API使用手册(基于Java和C#)

    WebDriver基本API使用手册(基于Java和C#) http://www.docin.com/p-747728551.html

  6. Populating Next Right Pointers in Each Node II--leetcode难题讲解系列

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  7. python 集合set

    python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ...

  8. HDU 1175 连连看

    连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. 关于fork的一道经典面试题

    这是一道面试题,问程序最终输出几个“-”: #include<stdio.h> #include<sys/types.h> #include<unistd.h> i ...

  10. __get,__set

    __get,__set 为php的magic方法,在类中定义为 public 类型. class UserModel { private $id; public $name; public funct ...