Delphi 7 Windows Vista / 7 Брандмауэр Исключения Сетевые Места - PullRequest
5 голосов
/ 07 февраля 2012

У меня есть этот кусок кода, который я нашел и реализовал в соответствии с 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 здесь

enter image description here

Когда установлено только Public, у моей программы возникают проблемы с доступом к моему хосту через FTP-соединение, что делает мою программу бесполезной. Эта проблема является особенной только для Windows Vista / 7; на XP текущая конфигурация работает нормально.

Пожалуйста, если у вас есть какие-либо подсказки или полезные указатели, поделитесь ими.

1 Ответ

9 голосов
/ 07 февраля 2012

Начиная с 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;
...