Чтобы создать новое правило
для брандмауэра
нужно добавить его к коллекции
Rules объекта
INetFwPolicy2.
Так как в предыдущих постах данной серии я уже создал класс-обёртку для правила, то ниже просто приведу код, для создания нового правила.
Code:
public void CreateRule(FirewallRule firewallRule)
{
try
{
if (firewallRule == null) throw new ArgumentNullException("firewallRule");
var fwRule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
if (String.IsNullOrEmpty(firewallRule.Name.Trim())) throw new ArgumentException("Name");
fwRule.Name = firewallRule.Name;
if (!String.IsNullOrEmpty(firewallRule.ApplicationName)) fwRule.ApplicationName = firewallRule.ApplicationName;
fwRule.Description = firewallRule.Description;
fwRule.Grouping = firewallRule.Grouping;
fwRule.Protocol = (int)firewallRule.Protocol.ConvertTo();
fwRule.Direction = firewallRule.Direction.ConvertTo();
fwRule.Enabled = firewallRule.Enabled;
fwRule.EdgeTraversal = firewallRule.EdgeTraversal;
if (firewallRule.Protocol != ProtocolEnum.Any)
{
if (!String.IsNullOrEmpty(firewallRule.LocalPorts)) fwRule.LocalPorts = firewallRule.LocalPorts;
if (!String.IsNullOrEmpty(firewallRule.RemotePorts)) fwRule.RemotePorts = firewallRule.RemotePorts;
}
if (firewallRule.Protocol == ProtocolEnum.Icmp)
{
if (!String.IsNullOrEmpty(firewallRule.IcmpTypesAndCodes)) fwRule.IcmpTypesAndCodes = firewallRule.IcmpTypesAndCodes;
}
if (!String.IsNullOrEmpty(firewallRule.LocalAddresses)) fwRule.LocalAddresses = firewallRule.LocalAddresses;
if (!String.IsNullOrEmpty(firewallRule.RemoteAddresses)) fwRule.RemoteAddresses = firewallRule.RemoteAddresses;
if (!String.IsNullOrEmpty(firewallRule.InterfaceTypes)) fwRule.InterfaceTypes = firewallRule.InterfaceTypes;
fwRule.Profiles = (Int32)firewallRule.Profiles;
fwRule.Action = firewallRule.Action.ConvertTo();
fwRule.serviceName = firewallRule.ServiceName;
netFwPolicy2.Rules.Add(fwRule);
}
catch (Exception ex)
{
throw;
}
}
При создании правила следует соблюдать все форматы значений свойств, а также порядок установки этих значений, которые я описал в
предыдущем посте.
Для удаления правил я сделал два обычных метода:
Code:
public void RemoveRule(FirewallRule firewallRule)
{
try
{
if (firewallRule == null) throw new ArgumentNullException("firewallRule");
RemoveRule(firewallRule.Name);
}
catch (Exception ex)
{
throw;
}
}
public void RemoveRule(String name)
{
try
{
if (name == null) throw new ArgumentNullException("name");
netFwPolicy2.Rules.Remove(name);
}
catch (Exception ex)
{
throw;
}
}
Пример создания нового правила приведен ниже:
Code:
var rule = new FirewallRule
{
ApplicationName = Assembly.GetExecutingAssembly().Location,
Name = "FirewallSecurityConsole",
Action = ActionEnum.Block,
Description = "Firewall Security Console rule",
Profiles = ProfileType.All,
Protocol = ProtocolEnum.Tcp,
Direction = DirectionEnum.In,
Enabled = true
};
FirewallManager.Instance.CreateRule(rule);
Исходный код
Великолепно!
ОтветитьУдалитьБольшое спасибо, очень помогло отбивать попытки подбора пароля по RDP.
Ник
Спасибо большое! Всё прекрасно работает. Очень полезная вещь
ОтветитьУдалить