标题: 访问Vista防火墙
- appleseeker 2007-07-10 17:12 阅读:2182
- 评论:8 查看评论 | 添加评论
Vista下的防火墙的访问和XP访问方式有很大区别
XP有2种方法,但是Vista下目前还没有比较全面能够分析防火墙的所有设置
先将我的个人心得和大家分享下

1。通过注册表方式访问:

防火墙的很多设置都存放在注册表中,具体的键值如下:
在HKEY_LOCAL_MACHINE\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy下DomainProfile中的内容为机器加入域后存放的信息
StandardProfile中的内容为机器不加入域存放的信息

在这2个key下同样有3个键值
EnableFirewall:防火墙开启
DoNotAllowExceptions:不允许例外
DisableNotifications:提示信息

在这2个Key下也有2个子键
AuthorizedApplications:允许通过的应用程序
GloballyOpenPorts:打开的端口

用注册表的方式访问XP的防火墙设置基本上都能取得正确,但此方法在Vista下很大程度上不适用。
Vista在注册表的键值上改变很多,对注册表的改变,并不能使得防火墙的设置发生变化。
大家有兴趣的话可以自己试试,Vista下的注册表键值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess
这目录下有default和Parameters两个子键目录,都存放着相应的设置。

2。通过dll方式访问:

.net开发需要用到hnetcfg.dll
c/c++开发还需要用到头文件netfw.h,XP和Vista都需要下载对应的SDK,才有该头文件

这里就介绍.net开发细节,将该dll加入工程后,在工程引用上会出现3个命名空间,分别是NATUPNPLib,NETCONLib,NetFwTypeLib
防火墙的设置都在NetFwTypeLib中,其余2个大家有兴趣可以自己研究研究。
用到的主要接口:
INetFwAuthorizedApplications:允许通过的所有应用程序
INetFwServices:允许通过的所有的服务及服务端口
INetFwPolicy:防火墙策略
INetFwProfile:防火墙设置
INetFwMgr:防火墙的管理类吧

NetFwTypeLib该命名空间下都是接口,只能通过反射方式获得类实例,入口为INetFwMgr。

参考代码:
[图片][图片]
 1[图片]            Type typFwMgr = null;
 2[图片]            NetFwTypeLib.INetFwAuthorizedApplications iApps = null;
 3[图片]            NetFwTypeLib.INetFwServices iServices = null;
 4[图片]            NetFwTypeLib.INetFwMgr iFwMgr = null;
 5[图片]            NetFwTypeLib.INetFwPolicy iFwPolicy = null;
 6[图片]            NetFwTypeLib.INetFwProfile iFwProfile = null;
 7[图片]            typFwMgr = Type.GetTypeFromCLSID(new Guid("{304CE942-6E39-40D8-943A-B913C40C9CD4}"));
 8[图片]
 9[图片]            iFwMgr = (NetFwTypeLib.INetFwMgr)Activator.CreateInstance(typFwMgr);
10[图片]            iFwPolicy = iFwMgr.LocalPolicy;
11[图片]            iFwProfile = iFwPolicy.CurrentProfile;
12[图片]
13[图片]            bool isFireEnabled = iFwProfile.FirewallEnabled;
14[图片]            bool isFireException = iFwProfile.ExceptionsNotAllowed;
15[图片]
16[图片]            iApps = iFwProfile.AuthorizedApplications;
17[图片]            iServices = iFwProfile.Services;
18[图片]
19[图片]            System.Console.WriteLine("Firewall Enabled: {0}", isFireEnabled);
20[图片]            System.Console.WriteLine("Firewall ExceptionsNotAllowed: {0}\n", isFireException);
21[图片]
22[图片]            foreach (NetFwTypeLib.INetFwAuthorizedApplication iApp in iApps)
23[图片][图片]            [图片]{
24[图片]                System.Console.WriteLine("Application Name is:\n{0}\n", iApp.Name);
25[图片]                System.Console.WriteLine("Application ProcessImageFileName is: \n{0}\n", iApp.ProcessImageFileName);
26[图片]            }
27[图片]
28[图片]            foreach (NetFwTypeLib.INetFwService iService in iServices)
29[图片][图片]            [图片]{
30[图片]                if (iService.Enabled)
31[图片][图片]                [图片]{
32[图片]                    System.Console.WriteLine("Service Name is:\n{0}", iService.Name);
33[图片]                    foreach (NetFwTypeLib.INetFwOpenPort iPort in iService.GloballyOpenPorts)
34[图片][图片]                    [图片]{
35[图片]                        System.Console.WriteLine("{0}  {1}", iPort.Port, iPort.Name);
36[图片]                    }
37[图片]                    System.Console.WriteLine();
38[图片]                }
39[图片]            }

其中Type.GetTypeFromCLSID表示获取与指定类标示符关联的类型。
guid的取得,我是通过查注册表取得的,可以搜索命名空间。
这种方式不是特别好,如果有更好的方法,希望告知,谢谢。

这种方式访问防火墙,XP下完全没有问题,Vista下,除了用户自己添加的应用程序和服务端口无法获得外,其它都能获得,用户自己添加的应用程序和服务端口同样在注册表中没有找到,可能还是存放的位置问题。以后会对该文章进行补充说明。

参考文章:
.net:http://blog.csdn.net/mittermeyer/archive/2006/05/19/745856.aspx
c/c++:http://blog.csdn.net/Y___Y/archive/2007/03/22/1537493.aspx

2007/7/11补充:
用dll方式访问,在vista下开发的话,直接用windows\system32下的firewallapi.dll
将该dll加入后,在工程引用上只会出现1个命名空间,即NetFwTypeLib

搜索注册表的CLSID方法,搜索firewall即可。只要搜索到一个CLSID中有3个子键目录,其中最后一个为ProgID,里面有唯一的键值,即保存该类名称。
查看评论 | 添加评论
返回顶部 | 返回首页