主要目的是为了实现在系统运行时,自动将自身可执行文件添加到SP2自带的防火墙的例外列表中。MSDN中说有关防火墙的API是一组COM组件,由%SYSTEM32%\hnetcfg.dll实现。在工程中添加该dll的引用,发现生成的类型库中全是interface,没有CoClass,也就是说我没办法new一个实例然后利用它去实现我期望的功能。遇到这种情况,在VB中可以用CreateObject,利用COM组件的ClassFactory去创建,C#下不知道有没有什么对等的方法,期望各位DX指教。
或者我引用的方法不正确,有其他的方式可以用C#设置Windows XP SP2自带的防火墙。期望各位的答复,先谢过了!

解决方案 »

  1.   

    Framework提供了一个AppDomain.CreateComInstanceFrom的方法,这个方法似乎只能从一个Assembly从创建COM实例。我碰到的情况就是引用自动生成的Interop.NetFwTypeLib.dll中全部是接口,没有实现的类的定义,任何一个类型都没有构造函数可以创建实例,莫名中...
      

  2.   

    直接调用楼主所说的dll似乎不行。
    我换了一个思路来看待这个问题,希望对楼主有所帮助。
    这里我只说思路,不谈具体的实现,请见谅。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中的注册表项。
      

  3.   

    有关创建实例,我已经找到方法了。Type typFwMgr = null;
    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的设置很有帮助。谢谢!
      

  4.   

    刚才代码Copy错了-_-!
    ------------
    TypetypFwMgr = null;
    NetFwTypeLib.INetFwMgriFwMgr = null;typFwApp = Type.GetTypeFromCLSID(new Guid("{EC9846B3-2762-4A6B-A214-6ACB603462D2}"));
    iApp = (NetFwTypeLib.INetFwAuthorizedApplication) Activator.CreateInstance(typFwApp);