A:防火墙信息 AURD

This commit is contained in:
jimmy committed 2025-07-26 23:51:35 +08:00
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>
+281 -20
View File
@@ -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
}
}