Delphi 7 Windows Vista/7 防火墙异常网络位置
Posted
技术标签:
【中文标题】Delphi 7 Windows Vista/7 防火墙异常网络位置【英文标题】:Delphi 7 Windows Vista/7 Firewall Exception Network Locations 【发布时间】: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 上,当前配置可以正常工作。
如果您有任何线索或有用的建议,请分享。
【问题讨论】:
【参考方案1】:从 Windows Vista 开始,您必须使用 INetFwPolicy2 和 INetFwRule 接口才能访问新的防火墙功能。
试试这个在公共和私人配置文件中添加新规则的示例。
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,它是即用型代码。代码是否需要以管理员权限运行?以上是关于Delphi 7 Windows Vista/7 防火墙异常网络位置的主要内容,如果未能解决你的问题,请参考以下文章
Vista / 7下的本机提示/工具提示与Delphi 7?
Windows XP 与 Vista/7 上的 MS Crypto API 行为
PyQt:Windows Vista/7 上 QTableView 中的 QStyledItemDelegate?
我如何在 Windows(xp、vista、7)欢迎屏幕或锁定屏幕(如 VNC 或 Dame Ware)中进行交互