【问题标题】:How to open port in Win7 Firewall using Delphi如何使用Delphi在Win7防火墙中打开端口
【发布时间】:2013-12-02 16:56:30
【问题描述】:

我想在 Windows 7 防火墙中打开一个端口以通过 Delphi 进行端口转发,但正如在其他线程中所说,Windows 7 在防火墙中有多个配置文件(公共、私有),下一个代码仅将异常添加到其中一个。

代码:

procedure addPortToFirewall(EntryName:string;PortNumber:Cardinal); 
Const 
  NET_FW_PROFILE_DOMAIN = 0; 
  NET_FW_PROFILE_STANDARD = 1; 
  NET_FW_IP_VERSION_ANY = 2; 
  NET_FW_IP_PROTOCOL_UDP = 17; 
  NET_FW_IP_PROTOCOL_TCP = 6; 
  NET_FW_SCOPE_ALL = 0; 
  NET_FW_SCOPE_LOCAL_SUBNET = 1;var 
  fwMgr,port:OleVariant; 
  profile:OleVariant; 
begin 
  fwMgr := CreateOLEObject('HNetCfg.FwMgr'); 
  profile := fwMgr.LocalPolicy.CurrentProfile; 
  port := CreateOLEObject('HNetCfg.FWOpenPort'); 
  port.Name := EntryName; 
  port.Protocol := NET_FW_IP_PROTOCOL_TCP; 
  port.Port := PortNumber; 
  port.Scope := NET_FW_SCOPE_ALL; 
  port.Enabled := true; 
  profile.GloballyOpenPorts.Add(port); 
end; 

我知道这是用于 Windows XP 的代码,但用于 Win 7 的代码我找不到如何打开端口而不是应用程序。

代码:

procedure TForm1.Button4Click(Sender: TObject);
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        := 'Test Firwwall';
  NewRule.Description := 'Test Firewall';
  NewRule.Applicationname := 'Exe File';
  NewRule.Protocol := NET_FW_IP_PROTOCOL_TCP;
  NewRule.Enabled := TRUE;
  NewRule.Profiles := Profile;
  NewRule.Action := NET_FW_ACTION_ALLOW;
  RulesObject.Add(NewRule);
end;

为了让所有这些都清楚,我如何使用delphi在Windows 7防火墙中打开A端口?用于多个配置文件(私人、公共)。

谢谢你的问候。

【问题讨论】:

    标签: windows delphi port delphi-xe2 firewall


    【解决方案1】:

    要在 Windows 7 下打开端口,您必须指定 HNetCfg.FWRule 对象的 LocalPortsDirection 属性。这在 MSDN 文档Using Windows Firewall with Advanced Security 中有解释

    {$APPTYPE CONSOLE}
    
    
    uses
      SysUtils,
      ActiveX,
      ComObj,
      Variants;
    
    procedure AddExceptionToFirewall(Const Caption, Executable: String;Port : Word);
    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;
    NET_FW_RULE_DIR_IN  = 1;
    NET_FW_RULE_DIR_OUT = 2;
    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.LocalPorts :=  Port;
      NewRule.Direction := NET_FW_RULE_DIR_OUT;
      NewRule.Enabled := TRUE;
      NewRule.Grouping := 'My Group';
      NewRule.Profiles := Profile;
      NewRule.Action := NET_FW_ACTION_ALLOW;
      RulesObject.Add(NewRule);
    end;
    
    begin
     try
        CoInitialize(nil);
        try
          AddExceptionToFirewall('MyAppRule','MyApp.exe', 3307);
        finally
          CoUninitialize;
        end;
     except
        on E:EOleException do
            Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
        on E:Exception do
            Writeln(E.Classname, ':', E.Message);
     end;
     Writeln('Press Enter to exit');
     Readln;
    end.
    

    注意:此代码需要提升。

    【讨论】:

    • 谢谢!!!就像一个魅力,它只是我不习惯使用 OleObjects 并且有时会在 MSDN 文档中迷路,尽管我试图在 LocalPort 属性中找到它但找不到它。不管怎样,谢谢你的代码!!!
    • 我可以再询问一个信息吗?我添加了另一个 ole 对象来设置入站和出站,但我似乎无法找到有关如何将规则上的端口设置为“任何”的信息。有没有可能这样做,还是需要指定端口?
    • 没关系。如果我根本不指定端口,它会转到“任何”... :)
    猜你喜欢
    • 2019-12-22
    • 2012-08-16
    • 1970-01-01
    • 2016-06-06
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多