适用于 XP 的 Windows 防火墙规则

Posted

技术标签:

【中文标题】适用于 XP 的 Windows 防火墙规则【英文标题】:Windows firewall rule for XP 【发布时间】:2011-08-09 08:51:05 【问题描述】:

如何在 Windows XP 上以编程方式将应用程序或端口添加到 Windows 防火墙?

【问题讨论】:

Programatically Add Exception to windows vista firewall . 的可能重复项 Add to Firewall Exception list的可能重复 此答案仅适用于 xp。由于 OP 接受了这个及其有用的信息,因此编辑了标题,因此不是欺骗,因为重复的作品仅在 win7 和 vista 中有效。 【参考方案1】:

试试这个从我们的开源SQlite3UI.pas单元中提取的代码:

function GetXPFirewall(var fwMgr, profile: OleVariant): boolean;
begin
  Result := (Win32Platform=VER_PLATFORM_WIN32_NT) and
    (Win32MajorVersion>5) or ((Win32MajorVersion=5) and (Win32MinorVersion>0));
  if result then // need Windows XP at least
  try 
    fwMgr := CreateOleObject('HNetCfg.FwMgr');
    profile := fwMgr.LocalPolicy.CurrentProfile;
  except
    on E: Exception do
      result := false;
  end;
end;

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;

procedure AddApplicationToXPFirewall(const EntryName, ApplicationPathAndExe: string);
var fwMgr, profile, app: OleVariant;
begin
  if GetXPFirewall(fwMgr,profile) then
  try
    if profile.FirewallEnabled then begin
      app := CreateOLEObject('HNetCfg.FwAuthorizedApplication');
      try
        app.ProcessImageFileName := ApplicationPathAndExe;
        app.Name := EntryName;
        app.Scope := NET_FW_SCOPE_ALL;
        app.IpVersion := NET_FW_IP_VERSION_ANY;
        app.Enabled :=true;
        profile.AuthorizedApplications.Add(app);
      finally
        app := varNull;
      end;
    end;
  finally
    profile := varNull;
    fwMgr := varNull;
  end;
end;

procedure AddPortToXPFirewall(const EntryName: string; PortNumber: cardinal);
var fwMgr, profile, port: OleVariant;
begin
  if GetXPFirewall(fwMgr,profile) then
  try
    if profile.FirewallEnabled then begin
      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;
  finally
    port := varNull;
    profile := varNull;
    fwMgr := varNull;
  end;
end;

它将允许您将应用程序或端口添加到 XP 防火墙。 应该可以从 Delphi 6 到 XE。

【讨论】:

我已经更新了该单元的源代码,可以在 XP、Vista 和 Seven 上运行,无论是应用程序还是端口。见synopse.info/forum/viewtopic.php?pid=4652#p4652【参考方案2】:

可以编写 Windows 防火墙脚本,请参阅 Scripting the Windows Firewall

还有代码示例,例如here

【讨论】:

Delphi 7 支持基于 COM 的脚本 在这种情况下你应该尝试导入类型库,看我的链接,它提到了类型库DLL文件is usually located in "C:\Windows\System32\hnetcfg.dll"(这篇文章是关于XP的,我在Windows 7中检查了一个文件有这个名字) 要导入它尝试tlibimp -P c:\windows\system32\hnetcfg.dll - 但是查看它的内容我不确定这是否是正确的文件 也可以使用后期绑定,如问题Add to Firewall Exception list 嗨迈克尔,由于一个新的答案,我偶然发现了这个线程。你的回答按照目前的规则链接只能回复,也许你想改进一下。

以上是关于适用于 XP 的 Windows 防火墙规则的主要内容,如果未能解决你的问题,请参考以下文章

Azure 存储帐户防火墙规则适用于表但会破坏 blob 存储

预防勒索病毒需要关闭哪些端口

Win7自带的防火墙怎样添加端口????

勒索病毒哪些端口需要关闭

在防火墙的例外中注册程序(Windows7和XP),改写注册表

windows server 2008 防火墙配置