/// <summary>
/// windows防火墙入站规则IP添加器
/// </summary>
internal class NetFwRuleIPAdder {
readonly string ruleName;
readonly object _lock = new object();
/// <summary>
/// 创建一个添加器,可以将指定IP添加到ruleName规则中
/// </summary>
/// <param name="ruleName">规则名称</param>
public NetFwRuleIPAdder(string ruleName) {
this.ruleName = ruleName;
}
/// <summary>
/// 获取规则对象
/// </summary>
INetFwRule GetNetFwRule() {
INetFwRule netFwRule = null;
INetFwPolicy2 netFwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
foreach (INetFwRule rule in netFwPolicy2.Rules) {
if (rule.Name == ruleName && rule.Direction == NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN) { //匹配规则名和入站规则
netFwRule = rule;
break;
}
}
if (netFwRule == null) {
throw new Exception("未匹配到:" + ruleName + ",请先手动创建该规则");
}
return netFwRule;
}
/// <summary>
/// 向当前防火墙规则中添加IP
/// </summary>
public void AddIP(string ip) {
lock (_lock) {
var netFwRule = GetNetFwRule();
if (string.IsNullOrEmpty(netFwRule.RemoteAddresses)) {
netFwRule.RemoteAddresses = ip;
} else {
if (netFwRule.RemoteAddresses.Split(',').Contains(ip) == false) {
netFwRule.RemoteAddresses = netFwRule.RemoteAddresses + "," + ip;
}
}
LogHelper.Info(ip + " 添加完毕");
}
}
}