2014-12-05 31 views
5

Sto provando a gestire le regole del firewall (eccezioni) su Windows 7 usando Delphi XE3. Ho trovato un codice molto interessante per l'aggiunta di una regola al firewall di Windows, ma nulla sull'eliminazione (rimozione). Per favore, qualcuno può aiutare?Rimuovi Windows Firewall Rule (Exception) usando Delphi

ecco il codice per aggiungere la regola:

procedure AddExceptToFirewall(const Caption, AppPath: String); 
// Uses ComObj 
const 
    NET_FW_PROFILE2_PRIVATE = 2; 
    NET_FW_PROFILE2_PUBLIC = 4; 
    NET_FW_IP_PROTOCOL_TCP = 6; 
    NET_FW_ACTION_ALLOW  = 1; 
var 
    Profile: Integer; 
    Policy2: OleVariant; 
    RObject: OleVariant; 
    NewRule: OleVariant; 
begin 
    Profile := NET_FW_PROFILE2_PRIVATE OR NET_FW_PROFILE2_PUBLIC; 
    Policy2 := CreateOleObject('HNetCfg.FwPolicy2'); 
    RObject := Policy2.Rules; 
    NewRule := CreateOleObject('HNetCfg.FWRule'); 
    NewRule.Name  := Caption; 
    NewRule.Description := Caption; 
    NewRule.ApplicationName := AppPath; 
    NewRule.Protocol := NET_FW_IP_PROTOCOL_TCP; 
    NewRule.Enabled := True; 
    NewRule.Grouping := ''; 
    NewRule.Profiles := Profile; 
    NewRule.Action := NET_FW_ACTION_ALLOW; 
    RObject.Add(NewRule); 
end; 

Grazie!

risposta

5

È sufficiente chiamare INetFWRules.Remove, passando il nome della regola. Il nome è lo stesso che hai usato durante la creazione (RObject.Name nel codice che hai fornito sopra).

// Note: Normal COM exception handling should be used. Omitted for clarity. 

procedure RemoveExceptFromFirewall(const RuleName: String); 
const 
    NET_FW_PROFILE2_PRIVATE = 2; 
    NET_FW_PROFILE2_PUBLIC = 4; 
var 
    Profile: Integer; 
    Policy2: OleVariant; 
    RObject: OleVariant; 
begin 
    Profile := NET_FW_PROFILE2_PRIVATE OR NET_FW_PROFILE2_PUBLIC; 
    Policy2 := CreateOleObject('HNetCfg.FwPolicy2'); 
    RObject := Policy2.Rules; 
    RObject.Remove(RuleName); 
end; 

Non c'è quasi nulla nella documentazione collegata, BTW. Ho fornito il collegamento solo per riferimento.

+0

Grazie @Ken White! Non l'avevo mai trovato da nessuna parte ... – Guybrush

+1

@Paruba, dovresti davvero considerare di importare la libreria dei tipi invece di copiare il codice tardivo da Internet. Inoltre, dovresti controllare 'HRESULT' dalla chiamata al metodo. Entrambi i suggerimenti potrebbero farti risparmiare un sacco di problemi. –

+1

FYI, la TypeLibrary per l'API Firewall si trova in '% WINDIR% \ System32 \ FirewallAPI.dll'. –