主要目的是为了实现在系统运行时,自动将自身可执行文件添加到SP2自带的防火墙的例外列表中。MSDN中说有关防火墙的API是一组COM组件,由%SYSTEM32%\hnetcfg.dll实现。在工程中添加该dll的引用,发现生成的类型库中全是interface,没有CoClass,也就是说我没办法new一个实例然后利用它去实现我期望的功能。遇到这种情况,在VB中可以用CreateObject,利用COM组件的ClassFactory去创建,C#下不知道有没有什么对等的方法,期望各位DX指教。
或者我引用的方法不正确,有其他的方式可以用C#设置Windows XP SP2自带的防火墙。期望各位的答复,先谢过了!
或者我引用的方法不正确,有其他的方式可以用C#设置Windows XP SP2自带的防火墙。期望各位的答复,先谢过了!
解决方案 »
- EF问题请教:当项目中有多个edmx时,如何使多个edmx文件共用同一个连接字符串?
- C# winform开发连接数据库一般都用哪种方法???
- 对象名 'tb_examResult' 无效
- 错误 18 无法写入清单“obj\Debug\Control.exe.manifest”。无法创建目录或文件。
- c#解压缩问题。。。愚翁请进
- 请高手帮个忙--DataGrid中修改(已研究两天了)
- 关于文本文档读取的问题 真心求教 [问题点数:100分]
- 环星企业进销存互联网版,大家都去看看,C#要怎样才能实现呢?
- 新手请教接口!
- 如何在添加引用中看到自己的DLL?
- 软件安装连接不上数据库,请问如何解决?
- 请看一下下面这段代码为什么不能通过,有关IEnumerator
我换了一个思路来看待这个问题,希望对楼主有所帮助。
这里我只说思路,不谈具体的实现,请见谅。1.一般情况下,要永久保存程序的设置,有这么3个地方:配置文件、注册表、数据库。下面我们来一一尝试,看windows防火墙的设置保存在哪里,以及具体的设置格式是怎么样的。2.先来看看设置是否保存在某个配置文件中:
(1)打开“控制面板”,运行其中的“windows防火墙”(其程序位置为x:\windows\system32\FireWall.cpl),随便修改一下设置,然后保存并退出;
(2)用windows自带的“搜索”工具来查找最近修改过的文件,我们可以发现文件x:\windows\system32\config\system是刚才修改过的。而它正好是保存注册表信息的文件,OK,现在基本可以确定windows防火墙的设置保存在注册表里面了。
(注意:也可以用文件监视工具来跟踪文件的修改情况)
3.请打开注册表编辑器,我们将要在这里来探索一番:注册表结构庞杂,如果要找到某项信息,我一般采用2种方式:(a)按照注册表的层次结构来找(需要熟悉注册表的结构,并预先已经知道信息的存放位置);(b)在注册表中查找指定的关键字(关键字可以是需要查找的项目名,也可以是项目中显示的字符串)。因为我不知道防火墙的设置保存在哪里,所以我采用方法(b)来查找。
(1)让注册表搜索关键字“FireWall”,我们可以找到很多符合条件的键,其中[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy]就是我们的目的地。
下面我们来分析一下,防火墙设置的保存方式。
(注意:也可以用注册表监视工具来跟踪注册表的修改情况)
4.防火墙设置在注册表中的保存方式
(1)如上所述,防火墙的设置保存在[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy]中,其他的设置都相对它,下面我就不写这一上串字符,而用相对位置来表示了。
(2)启用(关闭)防火墙:键[StandardProfile] 数值名称 EnableFirewall 数值类型 REG_DWORD 数值数据 1-启用防火墙 0-关闭防火墙
(2)不允许例外:键[StandardProfile] 数值名称 DoNotAllowExceptions 数值类型 REG_DWORD 数值数据 1-不允许例外 0-允许例外
(3)防火墙阻止程序时是否显示通知:键[StandardProfile] 数值名称 DisableNotifications 数值类型 REG_DWORD 数值数据 1-显示通知 0-不显示通知
(4)例外中的程序列表:
键 [DomainProfile\AuthorizedApplications\List]和[StandardProfile\AuthorizedApplications\List]
数值类型 REG_SZ
数值名称 程序的完整路径文件名
数值数据 程序完整路径文件名:网络范围:是否允许访问网络:显示名称
(a)程序完整路径文件名:例如,d:\windows\avserve2.exe
(b)网络范围:
(b.1)任何计算机(无限制):*
(b.2)仅我的网络(子网):LocalSubNet
(b.3)自定义列表:以逗号分隔的IP地址,子网或同时包括IP地址、子网的列表(例如:192.168.114.201,192.168.114.201/255.255.255.0)
(c)是否允许访问网络:Enabled 允许 Disabled 禁止
(d)显示名称:显示在例外列表中的名称,一般为程序版本信息中的产品名称或者不包括扩展名的文件名
(5)端口列表:不能直接在设置程序显示出来,但是确实存在
键 [DomainProfile\GlobalOpenPorts\List]和[StandardProfile\GlobalOpenPorts\List]
数值类型 REG_SZ
数值名称 端口:协议类型
数值数据 端口:协议类型:网络范围:是否允许访问网络:显示名称
(a)端口:0~65536之间的数值
(b)协议类型:TCP或者UDP
(c)其余同(4)中的解释5.要调用windows防火墙的设置:直接运行x:\windows\system32\FireWall.cpl即可。6.要在自己的程序中设置防火墙:修改4中的注册表项。
NetFwTypeLib.INetFwMgr iFwMgr = null;
typFwApp = Type.GetTypeFromCLSID(new Guid("{EC9846B3-2762-4A6B-A214-6ACB603462D2}"));
iApp = (NetFwTypeLib.INetFwAuthorizedApplication) Activator.CreateInstance(typFwApp);
我觉得Framework应该提供等同VB当年的方式,否则COM这些东西就没法玩了。xrwang(无涯)的方式是解决问题的通用思路,对于分析我们不熟悉的Windows的设置很有帮助。谢谢!
------------
TypetypFwMgr = null;
NetFwTypeLib.INetFwMgriFwMgr = null;typFwApp = Type.GetTypeFromCLSID(new Guid("{EC9846B3-2762-4A6B-A214-6ACB603462D2}"));
iApp = (NetFwTypeLib.INetFwAuthorizedApplication) Activator.CreateInstance(typFwApp);