A:防火墙信息 AURD
This commit is contained in:
1 parent
d76b1be28d
commit
c7f24a9345
4 files changed
+323
-34
No files matched your search
@@ -21,6 +21,7 @@
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIcon_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F946b37ae1f1648b7a334a81e4b6ce11c64330_003F21_003F67e31def_003FIcon_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIDisposable_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5aeb6167299d4cfba30c86624130edbcc90938_003F41_003F0f283a8f_003FIDisposable_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIGrouping_00602_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F9abdf068a8774c97a3780c88b63c27b884928_003Fb6_003Ff1d12dc1_003FIGrouping_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AINetFwRule_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fd2ed9a92e29d4a0f91826359e93c440c4c00_003F5c_003F4c2f5fe4_003FINetFwRule_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIPAddress_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5dc54dc133694e6ca1812e5e56e958df388a0_003F68_003F0bc1a452_003FIPAddress_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIPEndPoint_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fdc231f7ab11c4da0b27a11c2ad4b9b4038938_003F06_003Fc689d816_003FIPEndPoint_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIWebSocketConnectionInfo_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa7d96aff8e344c1d9aa8042f229d493cae00_003F54_003Ff0e67f89_003FIWebSocketConnectionInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
@@ -35,6 +36,7 @@
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANetworkInterfaceType_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F92cb821cac5045cbbf918dc41b2ea2ca26920_003Fa4_003F57cbd2f9_003FNetworkInterfaceType_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANetworkInterface_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F9c72a65889eb40ae9d8e0f130d1572e0268a0_003F34_003F49f5e6ff_003FNetworkInterface_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProcessModule_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa70eaad10e4f42d4a1f24ff3865c6c6252928_003Fec_003F0881d57a_003FProcessModule_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProcess_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F0d82aa51d3914b469b94baa8bc2312c052910_003F11_003Fa7f7fe71_003FProcess_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProcess_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F4a26a752ec6249c4a090905d31c0cdfa528a0_003F8f_003F7037e590_003FProcess_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProcess_002Ecs_002Fl_003AC_0021_003FUsers_003Fcharlatans_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F272f7fa8ba8fe1496a488d5eda2dbd4f6cd182c1430c3cc7822b83dbf64b4b2_003FProcess_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProcess_002Ecs_002Fl_003AC_0021_003FUsers_003Fyllyo_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa70eaad10e4f42d4a1f24ff3865c6c6252928_003F1e_003Fd0b0af48_003FProcess_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
|
||||
@@ -33,7 +33,7 @@ public partial class App : System.Windows.Application
|
||||
base.OnStartup(e);
|
||||
|
||||
// 启动服务(如 WebSocket、HTTP、端口监听等)
|
||||
// StartMyServer();
|
||||
StartMyServer();
|
||||
|
||||
// NetView 网络监看
|
||||
var netView = new NetView();
|
||||
@@ -403,6 +403,286 @@ public partial class App : System.Windows.Application
|
||||
|
||||
#region 获取防火墙信息
|
||||
|
||||
// 查询防火墙规则 - 支持分页和筛选
|
||||
server.Get("/api/firewall/rules", async (context) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var firewallApi = new WindowsFirewallApi();
|
||||
|
||||
// 获取查询参数
|
||||
var queryParams = context.QueryParams;
|
||||
var startIndex = !string.IsNullOrEmpty(queryParams["start"]) ? int.Parse(queryParams["start"]) : 0;
|
||||
var limit = !string.IsNullOrEmpty(queryParams["limit"]) ? int.Parse(queryParams["limit"]) : 50;
|
||||
|
||||
// 构建筛选条件
|
||||
var filter = new RuleFilter();
|
||||
if (!string.IsNullOrEmpty(queryParams["name"])) filter.NamePattern = queryParams["name"];
|
||||
if (!string.IsNullOrEmpty(queryParams["direction"]) && Enum.TryParse<RuleDirection>(queryParams["direction"], true, out var direction))
|
||||
filter.Direction = direction;
|
||||
if (!string.IsNullOrEmpty(queryParams["enabled"]) && bool.TryParse(queryParams["enabled"], out var enabled))
|
||||
filter.Enabled = enabled;
|
||||
if (!string.IsNullOrEmpty(queryParams["protocol"]) && Enum.TryParse<ProtocolType>(queryParams["protocol"], true, out var protocol))
|
||||
filter.Protocol = protocol;
|
||||
if (!string.IsNullOrEmpty(queryParams["action"]) && Enum.TryParse<RuleAction>(queryParams["action"], true, out var action))
|
||||
filter.Action = action;
|
||||
if (!string.IsNullOrEmpty(queryParams["application"])) filter.ApplicationName = queryParams["application"];
|
||||
if (!string.IsNullOrEmpty(queryParams["port"])) filter.Port = queryParams["port"];
|
||||
|
||||
// 获取筛选后的规则
|
||||
var allRules = firewallApi.GetRulesByFilter(filter);
|
||||
var totalCount = allRules.Count;
|
||||
|
||||
// 分页
|
||||
var pagedRules = allRules.Skip(startIndex).Take(limit).ToList();
|
||||
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = true,
|
||||
Data = new
|
||||
{
|
||||
rules = pagedRules,
|
||||
totalCount = totalCount,
|
||||
startIndex = startIndex,
|
||||
limit = limit,
|
||||
hasMore = startIndex + limit < totalCount
|
||||
},
|
||||
Message = "查询成功"
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
context.Response.StatusCode = 500;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = $"查询防火墙规则失败: {ex.Message}"
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 新增防火墙规则
|
||||
server.Post("/api/firewall/rules", async (context) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrEmpty(context.RequestBody))
|
||||
{
|
||||
context.Response.StatusCode = 400;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = "请求体不能为空"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var createRequest = JsonHelper.FromJson<CreateRuleRequest>(context.RequestBody);
|
||||
if (createRequest == null)
|
||||
{
|
||||
context.Response.StatusCode = 400;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = "请求数据格式错误"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var firewallApi = new WindowsFirewallApi();
|
||||
var success = firewallApi.CreateRule(createRequest);
|
||||
|
||||
if (success)
|
||||
{
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = true,
|
||||
Message = "防火墙规则创建成功"
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
context.Response.StatusCode = 500;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = "防火墙规则创建失败"
|
||||
});
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
context.Response.StatusCode = 500;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = $"创建防火墙规则失败: {ex.Message}"
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 编辑防火墙规则
|
||||
server.Put("/api/firewall/rules", async (context) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrEmpty(context.RequestBody))
|
||||
{
|
||||
context.Response.StatusCode = 400;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = "请求体不能为空"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var updateRequest = JsonHelper.FromJson<UpdateRuleRequest>(context.RequestBody);
|
||||
if (updateRequest == null || string.IsNullOrEmpty(updateRequest.CurrentName))
|
||||
{
|
||||
context.Response.StatusCode = 400;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = "请求数据格式错误或缺少规则名称"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var firewallApi = new WindowsFirewallApi();
|
||||
var success = firewallApi.UpdateRule(updateRequest);
|
||||
|
||||
if (success)
|
||||
{
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = true,
|
||||
Message = "防火墙规则更新成功"
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
context.Response.StatusCode = 500;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = "防火墙规则更新失败,可能规则不存在"
|
||||
});
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
context.Response.StatusCode = 500;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = $"更新防火墙规则失败: {ex.Message}"
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 删除防火墙规则
|
||||
server.Delete("/api/firewall/rules", async (context) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var queryParams = context.QueryParams;
|
||||
if (string.IsNullOrEmpty(queryParams["name"]))
|
||||
{
|
||||
context.Response.StatusCode = 400;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = "缺少规则名称参数"
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var ruleName = queryParams["name"];
|
||||
var firewallApi = new WindowsFirewallApi();
|
||||
var success = firewallApi.DeleteRule(ruleName);
|
||||
|
||||
if (success)
|
||||
{
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = true,
|
||||
Message = "防火墙规则删除成功"
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
context.Response.StatusCode = 500;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = "防火墙规则删除失败,可能规则不存在"
|
||||
});
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
context.Response.StatusCode = 500;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = $"删除防火墙规则失败: {ex.Message}"
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 获取防火墙状态
|
||||
server.Get("/api/firewall/status", async (context) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var firewallApi = new WindowsFirewallApi();
|
||||
var status = firewallApi.GetFirewallStatus();
|
||||
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<FirewallStatus>
|
||||
{
|
||||
Success = true,
|
||||
Data = status,
|
||||
Message = "获取防火墙状态成功"
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
context.Response.StatusCode = 500;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = $"获取防火墙状态失败: {ex.Message}"
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 获取防火墙统计信息
|
||||
server.Get("/api/firewall/statistics", async (context) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var firewallApi = new WindowsFirewallApi();
|
||||
var statistics = firewallApi.GetStatistics();
|
||||
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<FirewallStatistics>
|
||||
{
|
||||
Success = true,
|
||||
Data = statistics,
|
||||
Message = "获取防火墙统计信息成功"
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
context.Response.StatusCode = 500;
|
||||
await context.Response.WriteJsonAsync(new ResponseModel<object>
|
||||
{
|
||||
Success = false,
|
||||
Message = $"获取防火墙统计信息失败: {ex.Message}"
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
#endregion
|
||||
|
||||
#region 取消订阅
|
||||
@@ -498,22 +778,3 @@ public class SubscriptionAppInfo : SubscriptionInfo
|
||||
/// </summary>
|
||||
public string ApplicationPath { get; set; }
|
||||
}
|
||||
|
||||
// 对于C#来说,我想获取windows中的防火墙的信息?我在开发一个网络监控软件,我想顺便把防火墙管理给集成进去,前端搭配vue3展示,应该也能很漂亮。
|
||||
// 所以第一步是获取防火墙信息,并且要是结构化的,能够转换为json发给前端的,所以我应该如何做?虽然有可能有些可能用不到,不过我希望尽可能多的获取到防火墙的信息。
|
||||
// 我要完成的功能包括:获取所有防火墙信息,打开或关闭防火墙,更改某个规则(重命名、开关等),删除某个规则,增加新的规则。
|
||||
// 基于此,对于它的C#后端,我们应该定义和设计这些API?
|
||||
// 我想要获取尽可能全面的信息,包括但不限于出站、进站、程序、协议、端口、远程端口、作用域、操作、配置文件、名称等。
|
||||
// 我想尽可能的复现windows官方的防火墙中的全部功能。
|
||||
// 我们首先需要定义其全部的API,比如读取,修改,新增,删除。
|
||||
//
|
||||
//
|
||||
//
|
||||
// 我在开发一个网络监控软件,我想顺便把防火墙管理给集成进去,前端搭配vue3展示,应该也能很漂亮。
|
||||
// 我现在后端已经能拿到了很多信息, 包括但不限于出站、进站、程序、协议、端口、远程端口、作用域、操作、配置文件、名称等。
|
||||
// 我想尽可能的复现windows官方的防火墙中的全部功能。但是UI要更好看。
|
||||
// 但是我也尽可能贴近官方防火墙设置的功能比如:比如windows官方防火墙的 “程序”-》自定义服务设置-》应用于下列服务,它的服务有很多,我们需要展示提供选择。
|
||||
// 再有,“协议和端口”中的协议类型也有很多,我们也要展示。比如它甚至能指定用户,可以选择用户和组。
|
||||
// 所以基于上,我们几乎是重写了防火墙的页面。
|
||||
// 我现在需要你基于这个能获取到的信息(可能有些我没提到),使用html完成一个防火墙的看板,要点击某个规则可以编辑,可以新增。
|
||||
// 新增的窗口和交互都需要完成,数据的展示也需要完成。你用假数据替代数据填充即可,要求界面要现代化,美观,优雅
|
||||
@@ -200,3 +200,4 @@ public class FirewallStatistics
|
||||
public List<string> TopApplications { get; set; } = new();
|
||||
public List<string> TopPorts { get; set; } = new();
|
||||
}
|
||||
|
||||
@@ -353,39 +353,64 @@ public class WindowsFirewallApi : IFirewallApi
|
||||
// 通过ProgID获取防火墙规则对象类型
|
||||
Type? netFwRuleType = Type.GetTypeFromProgID("HNetCfg.FWRule");
|
||||
if (netFwRuleType == null) return false;
|
||||
|
||||
|
||||
// 创建新的防火墙规则实例
|
||||
INetFwRule? newRule = (INetFwRule?)Activator.CreateInstance(netFwRuleType);
|
||||
if (newRule == null) return false;
|
||||
|
||||
|
||||
// 设置规则的各项属性
|
||||
newRule.Name = request.Name; // 规则名称
|
||||
newRule.Description = request.Description; // 规则描述
|
||||
newRule.ApplicationName = request.ApplicationName; // 应用程序路径
|
||||
newRule.ApplicationName = string.IsNullOrWhiteSpace(request.ApplicationName) ? null : request.ApplicationName; // 应用程序路径
|
||||
// 注意:INetFwRule 接口可能没有 ServiceName 属性,这里移除了对它的直接赋值
|
||||
newRule.Protocol = (int)request.Protocol; // 协议类型
|
||||
newRule.LocalPorts = request.LocalPorts; // 本地端口
|
||||
newRule.RemotePorts = request.RemotePorts; // 远程端口
|
||||
newRule.LocalAddresses = request.LocalAddresses; // 本地地址
|
||||
newRule.RemoteAddresses = request.RemoteAddresses; // 远程地址
|
||||
newRule.IcmpTypesAndCodes = request.IcmpTypesAndCodes; // ICMP类型和代码
|
||||
newRule.LocalAddresses = string.IsNullOrWhiteSpace(request.LocalAddresses) ? "*" : request.LocalAddresses; // 本地地址
|
||||
newRule.RemoteAddresses = string.IsNullOrWhiteSpace(request.RemoteAddresses) ? "*" : request.RemoteAddresses; // 远程地址
|
||||
newRule.Protocol = (int)request.Protocol;
|
||||
|
||||
// 设置为 1 表示 ICMP,6 表示 TCP,17 表示 UDP
|
||||
if ((int)request.Protocol == 1) // ICMP
|
||||
{
|
||||
newRule.LocalPorts = null;
|
||||
newRule.RemotePorts = null;
|
||||
if (!string.IsNullOrWhiteSpace(request.IcmpTypesAndCodes))
|
||||
{
|
||||
newRule.IcmpTypesAndCodes = request.IcmpTypesAndCodes;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 非 ICMP 时不要设置 IcmpTypesAndCodes,否则抛异常
|
||||
// 仅在 Protocol == 1 时有效,否则抛出异常
|
||||
// newRule.IcmpTypesAndCodes = null;
|
||||
if (!string.IsNullOrWhiteSpace(request.LocalPorts))
|
||||
{
|
||||
newRule.LocalPorts = request.LocalPorts; // 本地端口
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(request.RemotePorts))
|
||||
{
|
||||
newRule.RemotePorts = request.RemotePorts; // 本地端口
|
||||
}
|
||||
}
|
||||
newRule.Direction = (NET_FW_RULE_DIRECTION_)request.Direction; // 流量方向
|
||||
newRule.Enabled = request.Enabled; // 是否启用
|
||||
newRule.Profiles = ConvertToNetFwProfiles(request.Profiles); // 适用的配置文件
|
||||
newRule.Action = (NET_FW_ACTION_)request.Action; // 规则动作
|
||||
newRule.Grouping = request.Grouping; // 规则组
|
||||
newRule.InterfaceTypes = request.InterfaceTypes; // 接口类型
|
||||
|
||||
newRule.Grouping = string.IsNullOrWhiteSpace(request.Grouping) ? null : request.Grouping; // 规则组
|
||||
newRule.InterfaceTypes = string.IsNullOrWhiteSpace(request.InterfaceTypes) ? "All" : request.InterfaceTypes; // 接口类型
|
||||
|
||||
// 设置边缘遍历(用于某些特殊网络场景)
|
||||
if (request.EdgeTraversal)
|
||||
newRule.EdgeTraversal = request.EdgeTraversal;
|
||||
|
||||
|
||||
// 将新规则添加到防火墙
|
||||
_fwRules.Add(newRule);
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
catch (Exception ex)
|
||||
{
|
||||
var format = ex.ToString();
|
||||
Console.WriteLine(format); // 包含类型、消息、堆栈跟踪
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1138,4 +1163,4 @@ public class WindowsFirewallApi : IFirewallApi
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user