Windows 如何使用Delphi在Win7防火墙中打开端口
我想在Windows7防火墙中打开一个端口,以便通过Delphi进行端口转发,但正如在其他线程中所说的,Windows7在防火墙中有多个配置文件(公共、私有),下一个代码只为其中一个添加了例外 代码: 我知道这是用于Windows XP的代码,但Win 7的代码我找不到如何打开端口而不是应用程序 代码: 最后,为了让大家明白这一点,我如何使用delphi在Windows7防火墙中打开一个端口?用于多个配置文件(私有、公共)Windows 如何使用Delphi在Win7防火墙中打开端口,windows,delphi,port,delphi-xe2,firewall,Windows,Delphi,Port,Delphi Xe2,Firewall,我想在Windows7防火墙中打开一个端口,以便通过Delphi进行端口转发,但正如在其他线程中所说的,Windows7在防火墙中有多个配置文件(公共、私有),下一个代码只为其中一个添加了例外 代码: 我知道这是用于Windows XP的代码,但Win 7的代码我找不到如何打开端口而不是应用程序 代码: 最后,为了让大家明白这一点,我如何使用delphi在Windows7防火墙中打开一个端口?用于多个配置文件(私有、公共) 感谢您的支持。要在Windows 7下打开端口,必须指定HNetCfg.
感谢您的支持。要在Windows 7下打开端口,必须指定
HNetCfg.FWRule
对象的localport
和Direction
属性。MSDN文档对此进行了解释
注意:此代码需要仰角。谢谢!!!工作起来很有魅力,只是我不习惯使用OleObjects,有时会在MSDN文档中丢失,尽管我试图在LocalPort属性中找到它,但找不到。无论如何,谢谢你的代码!!!我可以再问一个信息吗?我添加了另一个ole对象来设置入站和出站,但似乎找不到关于如何将规则上的端口设置为“Any”的信息。是否有可能这样做,或者是否需要指定端口?无需担心。如果我根本不指定端口,它将转到“Any…”(下)
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;
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;
{$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.