此操作类主要使用了系统命令行来实现的,详细的命令可参照微软文档《如何使用"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. 开源Launcher - Wox 出炉了

    Wox 是一款免费开源的信息快速获取软件.她的创作灵感来自于Mac上Alfred和Window上的Launchy. 目前Wox托管在Github (http://www.github.com/qian ...

  2. Windows调试学习笔记:(二)WinDBG调试.NET程序示例

    好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Collections.Generic ...

  3. Embeding Python & Extending Python with FFPython

    Introduction ffpython is a C++ lib, which is to simplify tasks that embed Python and extend Python. ...

  4. jQuery插件实现图片展开效果,jquery.gallery。仿腾讯QQ空间说说图片展示效果。

    公司的项目http://www.umfun.com/,有个说说的页面(和腾讯QQ空间说说一样),里面有个发表图片功能,上传完图片,需要点击展开的效果. 当时手里面事情比较多(公司就我一个前端),忙不过 ...

  5. mysql主从复制原理

    复制如何工作 整体上来说,复制有3个步骤: (1)    master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events):       ...

  6. C++中实现回调机制的几种方式[转]

      (1)Callback方式Callback的本质是设置一个函数指针进去,然后在需要需要触发某个事件时调用该方法, 比如Windows的窗口消息处理函数就是这种类型. 比如下面的示例代码,我们在Do ...

  7. UFT\QTP 12 新特性

    UFT\QTP 12 新特性 http://blog.csdn.net/testing_is_believing/article/details/22310297

  8. 使用jQuery开发一个带有密码强度检验的超酷注册页面

    在今天的jQuery教程中,我们将介绍如何使用jQuery和其它相关的插件来生成一个漂亮的带有密码强度检验的注册页面,希望大家喜欢! 相关的插件和类库 complexify - 一个密码强度检验jQu ...

  9. Outer Join Query Over Dblink Can Fail With ORA-904 (Doc ID 730256.1)

    Outer Join Query Over Dblink Can Fail With ORA-904 (Doc ID 730256.1) To Bottom Modified:03-May-2013T ...

  10. struts2 using kindeditor upload pictures (including jmagic compressed images)

    Project uses a kindeditor3.4 UploadContentImgAction @SuppressWarnings("serial") @ParentPac ...