【问题标题】:Delphi 7 Windows Vista/7 Firewall Exception Network LocationsDelphi 7 Windows Vista/7 防火墙异常网络位置
【发布时间】:2012-02-29 02:56:23
【问题描述】:

我有根据http://www.activexperts.com/activmonitor/windowsmanagement/scripts/networking/windowsfirewall/找到并实现的这段代码

procedure AddExceptionToFirewall (Caption: String; Executable: String);
var
  FirewallMsg: OleVariant;
  Application: OleVariant;
  CurrentProfile: OleVariant;
begin
  FirewallMsg:= CreateOLEObject ('HNetCfg.FwMgr');
  CurrentProfile:= FirewallMsg.LocalPolicy.CurrentProfile;
  Application:= CreateOLEObject ('HNetCfg.FwAuthorizedApplication');
  Application.ProcessImageFileName:= Executable;
  Application.Name:= Caption;
  Application.Scope:= FW_SCOPE_ALL;
  Application.IpVersion:= FW_IP_VERSION_ANY;
  Application.Enabled:= True;
  CurrentProfile.AuthorizedApplications.Add (Application);
end;

问题是,在 Windows 7 上,它仅将异常添加为 Public 而不是 Private,正如您在此处的 RED 中所看到的那样

当设置为仅公开时,我的程序在通过 FTP 连接访问我的主机时遇到问题,从而使我的程序无用。 此问题仅适用于 Windows Vista/7;在 XP 上,当前配置可以正常工作。

如果您有任何线索或有用的建议,请分享。

【问题讨论】:

    标签: delphi windows-vista delphi-7 windows-firewall


    【解决方案1】:

    从 Windows Vista 开始,您必须使用 INetFwPolicy2INetFwRule 接口才能访问新的防火墙功能。

    试试这个在公共和私人配置文件中添加新规则的示例。

    procedure AddExceptionToFirewall(Const Caption, Executable: String);
    const
    NET_FW_PROFILE2_DOMAIN  = 1;
    NET_FW_PROFILE2_PRIVATE = 2;
    NET_FW_PROFILE2_PUBLIC  = 4;
    
    NET_FW_IP_PROTOCOL_TCP = 6;
    NET_FW_ACTION_ALLOW    = 1;
    var
      fwPolicy2      : OleVariant;
      RulesObject    : OleVariant;
      Profile        : Integer;
      NewRule        : OleVariant;
    begin
      Profile             := NET_FW_PROFILE2_PRIVATE OR NET_FW_PROFILE2_PUBLIC;
      fwPolicy2           := CreateOleObject('HNetCfg.FwPolicy2');
      RulesObject         := fwPolicy2.Rules;
      NewRule             := CreateOleObject('HNetCfg.FWRule');
      NewRule.Name        := Caption;
      NewRule.Description := Caption;
      NewRule.Applicationname := Executable;
      NewRule.Protocol := NET_FW_IP_PROTOCOL_TCP;
      NewRule.Enabled := TRUE;
      NewRule.Profiles := Profile;
      NewRule.Action := NET_FW_ACTION_ALLOW;
      RulesObject.Add(NewRule);
    end;
    

    【讨论】:

    • 哇,效果不错,它甚至可以手动使防火墙私有和公共策略无法删除!非常感谢 RRUZ!
    • 如果 CreateOleObject 返回 nil 怎么办?顺便说一句,是否有 CreateOleObject 的 MSDN 页面,其中包含它可以返回和不能返回的文档?
    • @Arioch'The,CreateOleObject函数内部使用CoCreateInstanceWinApi方法,所有的错误码都是使用OleCheck方法捕获的,所以如果出现任何错误就会引发异常.
    • 感谢 RRUZ,它是即用型代码。代码是否需要以管理员权限运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2014-07-04
    • 2014-12-05
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多