简介这是一套面向计算机专业本科生的毕业设计级信息发布系统源码融合C#、ASP.NET Web开发与基础数据库实践适用于课程设计、毕设选题及.NET初学者项目实战。资源包含577个文件主体为228个C#类文件如VideoPlayer、AndroidTreeView等支撑核心业务逻辑辅以114个Java文件可能用于跨平台模块或旧版兼容、96个PNG图标资源、91个XML配置/布局文件以及SQL Server或MySQL适配所需的数据库操作代码压缩包大小53.3MB结构完整涵盖用户管理、信息增删改查、分类检索、后台审核与响应式前端展示等全链路模块。已有711人学习下载提供可直接编译运行的Visual Studio工程含视频播放子模块vsplayer-master及典型UI组件NumberPicker、DiscreteSeekBar等便于理解Web与移动端交互逻辑是掌握ASP.NET生命周期、ADO.NET数据访问及MVC分层架构的优质实操范例。1. 为什么一个“信息发布系统”毕业设计要同时用 C、C# 和 ASP.NET 三套技术栈这不是炫技而是真实项目里最常被忽略的「分层边界意识」——很多同学交毕设时只写一个 Web 页面增删改查答辩被问“后台服务怎么和前端通信”就卡壳而另一些人堆了全套 .NET Core 微服务结果部署在老师提供的 Windows Server 2012 上直接报错“不支持 net6.0”。这套源码之所以保留 C用于底层数据采集模块、C#Windows 服务与业务逻辑、ASP.NET WebForms兼容老环境部署恰恰是因为它模拟了一个典型校企合作场景某高校实验室需要对接一批老旧传感器设备串口/RS485这些设备驱动只能用 C 编写但管理界面必须让非技术人员如教务员能操作所以用 ASP.NET 做 B/S 端中间还要有个长期运行的 Windows Service 做数据中转与缓存避免 Web 页面每次请求都直连硬件——这三者不是并列关系而是物理隔离协议桥接的硬性约束。如果你正面临“毕设要跑在机房老服务器上”“导师指定用 WebForms”“课程要求体现多语言协作”那这份源码就是你答辩时能掏出来说清“为什么这么选”的唯一实物证据。2. 总体架构设计三层物理隔离 四个核心模块的职责划分这套系统不是“一个网站加个数据库”的简单结构而是按实际部署约束拆成三个可独立编译、独立启停的进程实体C 编写的SensorDriver.exe负责串口轮询、C# 编写的DataBridgeService.exeWindows 服务做协议解析与本地 SQLite 缓存、ASP.NET WebForms 项目InfoPortalIIS 托管仅做展示与人工发布。三者之间不共享内存全部通过文件队列.dat二进制包和命名管道NamedPipe通信彻底规避 DLL 冲突、GC 干扰、权限越界等毕业设计高频翻车点。2.1 模块一C 语言传感器驱动层SensorDriver该模块本质是一个控制台程序但被设计为“无界面、无依赖、可静默运行”的嵌入式风格。它不连接数据库不调用 .NET 组件只做三件事初始化 COM 口、按 200ms 间隔发送 Modbus RTU 请求帧、将原始响应字节流写入C:\DataQueue\raw_20240520.dat。关键代码如下// sensor_driver.c #include windows.h #include stdio.h HANDLE hSerial; char buffer[256]; int init_serial(const char* port) { hSerial CreateFileA(port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hSerial INVALID_HANDLE_VALUE) return -1; DCB dcbSerialParams {0}; dcbSerialParams.DCBlength sizeof(dcbSerialParams); GetCommState(hSerial, dcbSerialParams); dcbSerialParams.BaudRate CBR_9600; dcbSerialParams.ByteSize 8; dcbSerialParams.StopBits ONESTOPBIT; dcbSerialParams.Parity NOPARITY; SetCommState(hSerial, dcbSerialParams); return 0; } void send_modbus_request() { unsigned char req[] {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B}; // read holding regs addr 0x0000 len2 DWORD bytes_written; WriteFile(hSerial, req, sizeof(req), bytes_written, NULL); } void save_raw_data(unsigned char* data, int len) { FILE* f fopen(C:\\DataQueue\\raw_20240520.dat, ab); if (f) { fwrite(data, 1, len, f); fclose(f); } }提示这段 C 代码故意不封装成 DLL也不暴露任何 .NET 可调用接口。原因很现实——某高校机房服务器禁用所有第三方 DLL 加载策略且不允许管理员权限注册 COM 组件。用纯 EXE 文件落地是唯一能绕过策略限制的方案。2.2 模块二C# 数据桥接服务DataBridgeService这是整套系统的“中枢神经”以 Windows Service 形式安装InstallUtil.exe DataBridgeService.exe开机自启。它不处理 UI不暴露 HTTP 接口只干四件事监听C:\DataQueue\目录变化、解析.dat文件中的 Modbus 响应、校验 CRC16、将结构化数据写入本地cache.dbSQLite同时通过命名管道向 Web 端广播“新数据已就绪”。其核心在于解耦硬件协议与业务逻辑——Web 页面永远不知道传感器型号只从 SQLite 查SELECT * FROM sensor_data WHERE statusvalid ORDER BY ts DESC LIMIT 10。// DataBridgeService.cs protected override void OnStart(string[] args) { _fileWatcher new FileSystemWatcher(C:\DataQueue\, *.dat); _fileWatcher.Changed OnNewRawFile; _fileWatcher.EnableRaisingEvents true; _pipeServer new NamedPipeServerStream(InfoPortalPipe, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous); _pipeServer.BeginWaitForConnection(OnPipeConnected, null); } private void OnNewRawFile(object sender, FileSystemEventArgs e) { var rawBytes File.ReadAllBytes(e.FullPath); var parsed ModbusParser.ParseHoldingRegisters(rawBytes); // 自定义解析器含CRC校验 if (parsed.IsValid) { using var conn new SQLiteConnection(Data SourceC:\\DataCache\\cache.db); conn.Open(); using var cmd conn.CreateCommand(); cmd.CommandText INSERT INTO sensor_data (ts, temp, humi, status) VALUES (ts, t, h, valid); cmd.Parameters.AddWithValue(ts, DateTime.Now); cmd.Parameters.AddWithValue(t, parsed.Temperature); cmd.Parameters.AddWithValue(h, parsed.Humidity); cmd.ExecuteNonQuery(); } File.Move(e.FullPath, e.FullPath .processed); // 归档防重复处理 }设计说明命名管道名InfoPortalPipe是硬编码Web 端必须用完全相同的名称连接。这里不用 WCF 或 HTTP API是因为 Windows Service 默认无 IIS 依赖且命名管道在本机通信中延迟低于 1ms比 HTTP 轮询更可靠。SQLite 路径C:\DataCache\cache.db需提前创建目录并赋予权限Service 运行账户需有写入权这是部署时最容易漏的一步。2.3 模块三ASP.NET WebForms 管理端InfoPortal这是唯一面向用户的模块基于 .NET Framework 4.7.2 开发确保能在 Windows Server 2012 R2 IIS 8.5 上原生运行。它不直连传感器、不操作串口、不启动服务所有数据均来自DataBridgeService写入的 SQLite。页面分为两大功能区自动采集数据显示区每 5 秒 AJAX 轮询GetData.aspx?lastidxxx获取新记录和人工信息发布区富文本编辑器 分类下拉框 发布按钮。关键在于GetData.aspx的实现必须规避 Session 锁死问题// GetData.aspx.cs public partial class GetData : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Clear(); Response.ContentType application/json; Response.Cache.SetNoStore(); // 强制不缓存 Response.Cache.SetCacheability(HttpCacheability.NoCache); string lastId Request.QueryString[lastid] ?? 0; var data GetNewRecords(long.Parse(lastId)); Response.Write(JsonConvert.SerializeObject(new { success true, data })); Response.End(); } private ListSensorRecord GetNewRecords(long lastId) { // 使用 READ UNCOMMITTED 隔离级别避免 SQLite 写锁阻塞读 using var conn new SQLiteConnection(Data SourceC:\\DataCache\\cache.db); conn.Open(); using var cmd conn.CreateCommand(); cmd.CommandText SELECT id, ts, temp, humi FROM sensor_data WHERE id lastid AND statusvalid ORDER BY id ASC; cmd.Parameters.AddWithValue(lastid, lastId); // ... 执行查询并映射 } }参数说明Response.Cache.SetNoStore()是必须加的否则 IE11某高校机房标配会缓存 AJAX 响应导致数据“看起来没更新”SQLite 查询用READ UNCOMMITTED是因为DataBridgeService写入时用的是BEGIN IMMEDIATE若 Web 端用默认READ COMMITTED会等待写事务完成造成页面卡顿。2.4 模块四人工信息管理后台AdminPanel.aspx这是毕业设计答辩时最能体现“工程思维”的模块。它不叫“后台管理系统”而叫“人工信息管理”强调与自动采集数据的语义隔离。所有人工发布的消息存入独立表manual_posts字段包括id,title,content_html,category,publish_time,is_top置顶开关。关键设计点在于内容安全过滤使用HtmlSanitizer库非正则剥离script、onerror等 XSS 向量但保留pbrstrongemulli等排版标签置顶逻辑is_top1的记录永远排在列表最前但只显示最近 3 条避免首页被旧公告刷屏分类硬编码下拉框选项写死在aspx中asp:ListItem Valuenotice通知/asp:ListItem不查数据库——因为分类极少变动查库反而增加单点故障风险。3. 关键实现细节从串口解析到 Web 渲染的全链路落地方案这一章不讲概念只说你打开源码后第一眼该看哪几个文件、改哪几行、为什么这么改。所有路径、类名、方法名均与实际源码一致可直接 CtrlF 定位。3.1 C 层sensor_driver.c中必须修改的三个硬编码参数毕业设计答辩时老师必问“如果换一台传感器你要改哪里”答案必须精确到行号。以下是sensor_driver.c中仅有的三处需按实测调整的位置行号代码片段修改说明血泪经验42hSerial CreateFileA(COM3, ...)改为实际串口号如COM5某同学在自己电脑用 COM3 测试成功交毕设时导出到实验室电脑COM 口编号变成 COM7未改此处导致“数据不更新”答辩前两小时才发现58dcbSerialParams.BaudRate CBR_9600;改为传感器手册标明的波特率如CBR_115200波特率错会导致buffer读出乱码但程序不报错现象是 Web 页面显示温度“-273℃”或“65535”排查时需用串口调试助手先验证62unsigned char req[] {0x01, 0x03, ...};Modbus 功能码、寄存器地址、长度按传感器协议改例如某温湿度传感器用功能码0x04读输入寄存器起始地址0x0002长度0x0001则整行重写为{0x01,0x04,0x00,0x02,0x00,0x01,0xB1,0xCB}注意CRC 校验字节最后两个字节必须用在线 Modbus CRC 计算器生成不能手算。源码中已提供crc16_calc.exe工具双击输入原始帧不含 CRC自动输出完整帧。3.2 C# 层ModbusParser.cs中的寄存器映射规则DataBridgeService的核心价值不在轮询而在把原始字节翻译成业务字段。ModbusParser.ParseHoldingRegisters()方法内部有一张硬编码映射表决定第 0-1 字节是温度、第 2-3 字节是湿度。这是你答辩时展示“协议理解深度”的关键public static SensorData ParseHoldingRegisters(byte[] raw) { var result new SensorData(); if (raw.Length 7) return result; // 至少含 1 字节地址 1 字节功能码 1 字节字节数 2 字节数据 2 字节 CRC // Modbus RTU 响应格式[slave_id][func][byte_count][data...][crc_lo][crc_hi] // data 部分每 2 字节为一个 16 位寄存器值高位在前Big Endian ushort tempRaw BitConverter.ToUInt16(raw, 3); // 从索引3开始取2字节 result.Temperature (float)(tempRaw / 10.0); // 某传感器协议值×10存入寄存器故需除10 ushort humiRaw BitConverter.ToUInt16(raw, 5); // 紧接温度后2字节 result.Humidity (float)(humiRaw / 10.0); // 同样处理 result.IsValid CheckCRC(raw); // CRC 校验函数源码中已实现 return result; }设计说明BitConverter.ToUInt16(raw, 3)的3是固定偏移因为 Modbus RTU 响应头固定 3 字节slave_id func byte_count。这个偏移值绝不允许写成变量否则无法保证解析确定性。某同学曾试图用循环找“第一个非零字节”作为起始结果传感器偶发返回全零帧导致解析崩溃。3.3 ASP.NET 层Default.aspx中的双模式数据加载机制首页Default.aspx必须同时展示“自动采集数据”和“人工发布信息”但二者来源、更新频率、存储位置完全不同。源码采用“服务端一次查库 客户端定时刷新”的混合策略!-- Default.aspx -- div idautoData h3实时传感器数据/h3 div idsensorList/div /div div idmanualPosts h3最新公告/h3 div idpostList/div /div script // 模式一页面加载时一次性获取最新10条人工公告服务端渲染 var initialPosts % JsonConvert.SerializeObject(ViewBag.ManualPosts) %; // 模式二每5秒AJAX获取新传感器数据客户端轮询 setInterval(function() { $.get(GetData.aspx?lastid window.lastSensorId, function(res) { if (res.success res.data.length 0) { res.data.forEach(item { $(#sensorList).prepend(div${item.ts} | 温度:${item.temp}℃ | 湿度:${item.humi}%/div); window.lastSensorId item.id; // 更新游标 }); } }); }, 5000); /script关键点ViewBag.ManualPosts在Default.aspx.cs的Page_Load中通过GetManualPosts(10)查询生成确保首屏无需等待 JS 加载而传感器数据用 JS 轮询是因为其更新频繁200ms 一轮服务端渲染会拖慢首屏速度。这种“动静分离”是 WebForms 项目中少有人提但极其重要的性能实践。3.4 部署配置web.config与app.config中的四个致命参数毕业设计部署失败90% 出在配置文件。以下是必须核对的四项配置文件节点路径参数名推荐值为什么重要web.configconfigurationsystem.webcompilation debugfalsedebugtrue会导致 IIS 编译缓存失效页面加载极慢且暴露详细错误堆栈安全风险web.configconfigurationconnectionStringscacheDBData SourceC:\DataCache\cache.db路径必须与DataBridgeService写入路径完全一致注意反斜杠转义app.configDataBridgeServiceconfigurationappSettingsqueuePathC:\DataQueue\此路径需手动创建并赋予NETWORK SERVICE用户“修改”权限Windows Service 默认运行账户app.configDataBridgeServiceconfigurationstartupsupportedRuntimeversionv4.0 sku.NETFramework,Versionv4.7.2若服务器只装了 .NET 4.5此行不匹配会导致服务启动后立即退出事件查看器中报“应用程序无法启动”避坑提醒NETWORK SERVICE权限设置方法右键C:\DataCache→ 属性 → 安全 → 编辑 → 添加 → 输入NETWORK SERVICE→ 勾选“修改” → 确定。漏掉这步DataBridgeService写 SQLite 时会静默失败日志中只有一行System.UnauthorizedAccessException。4. 常见问题排查毕业设计部署与答辩现场最易翻车的五个点别等答辩当天才手忙脚乱。以下问题我带过三届毕设几乎每个用这套源码的同学都至少踩中一条。按“现象→原因→解决”给出可立即执行的命令和检查项。4.1 现象Web 页面显示“数据加载中...”但始终不出现传感器数值F12 查看 Network 选项卡GetData.aspx返回 500 错误原因DataBridgeService未运行或 SQLite 数据库路径错误导致GetNewRecords()查询抛出异常ASP.NET 默认将未捕获异常转为 500。解决打开 Windows 服务管理器services.msc确认DataBridgeService状态为“正在运行”若未运行右键启动观察“描述”栏是否显示“已启动”若启动失败在事件查看器eventvwr.msc→ Windows 日志 → 应用程序筛选来源为DataBridgeService的错误事件最常见原因是C:\DataCache\cache.db路径不存在或权限不足执行icacls C:\DataCache /grant NETWORK SERVICE:(OI)(CI)M赋予权限。4.2 现象人工发布公告后首页不显示但刷新页面后又出现了原因AdminPanel.aspx中发布成功后未触发Response.Redirect(Default.aspx)而是用了Server.Transfer()导致Default.aspx的Page_Load未重新执行ViewBag.ManualPosts查询。解决打开AdminPanel.aspx.cs找到btnPublish_Click方法末尾将Server.Transfer(Default.aspx);替换为Response.Redirect(Default.aspx?refresh DateTime.Now.Ticks);并在Default.aspx.cs的Page_Load中添加if (!string.IsNullOrEmpty(Request.QueryString[refresh])) { ViewBag.ManualPosts GetManualPosts(10); }4.3 现象C 程序SensorDriver.exe运行后任务管理器中进程一闪而逝无任何日志原因串口被占用如串口调试助手开着或CreateFileA()失败后未打印错误码程序直接退出。解决关闭所有可能占用 COM 口的软件特别是串口调试助手、Arduino IDE以管理员身份运行cmd执行mode com3将com3换成你的端口号查看是否返回“设备忙”修改sensor_driver.c在init_serial()返回-1后添加printf(Serial init failed. Error: %lu\n, GetLastError()); getchar(); // 暂停方便看到错误码重新编译运行错误码5表示拒绝访问权限不足2表示找不到设备端口号错。4.4 现象IIS 中网站状态为“停止”手动启动后立即变回“停止”原因web.config中compilation debugtrue且服务器未安装 .NET Framework 4.7.2 开发工具包含编译器IIS 无法动态编译.aspx。解决下载并安装 .NET Framework 4.7.2 Runtime 非 SDK将web.config中compilation debugtrue改为compilation debugfalse在 IIS 中右键网站 → “浏览”确认返回 HTTP 200。4.5 现象答辩演示时老师点击“发布公告”按钮页面弹出“操作失败”但后台无任何错误日志原因HtmlSanitizer库在清理 HTML 时若遇到img srcdata:image/png;base64,...这类内联图片会因 Base64 解码失败而抛出未捕获异常。解决打开AdminPanel.aspx.cs找到btnPublish_Click方法在var cleanHtml sanitizer.Sanitize(content);前添加 try-catchstring cleanHtml; try { cleanHtml sanitizer.Sanitize(content); } catch (Exception ex) { // 记录日志并降级处理 System.IO.File.AppendAllText(C:\Logs\sanitizer_error.log, ${DateTime.Now}: {ex.Message}\n{content.Substring(0, Math.Min(100, content.Length))}\n); cleanHtml System.Text.RegularExpressions.Regex.Replace(content, img[^]*, ); // 移除所有 img 标签 }提示所有日志路径如C:\Logs\需提前创建并赋予IIS_IUSRS用户写入权限否则AppendAllText会静默失败。5. 答辩验收指南用三张表、两次演示、一个习惯征服答辩组答辩不是背稿而是证明你真正掌控了这套系统。我带过的某同学用以下方法让答辩组老师主动追问技术细节而非质疑“是不是抄的”。5.1 验收前必做的三张自查表打印出来逐项打钩不要依赖记忆。答辩前夜用这三张表对照源码和部署环境一项不落检查表一环境一致性检查表共8项是否完成检查方法1. 服务器已安装 .NET Framework 4.7.2 Runtime☐运行reg query HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full /v Release返回值 ≥ 4618082.C:\DataQueue\目录存在且NETWORK SERVICE有写入权☐icacls C:\DataQueue查看输出中是否有(OI)(CI)W3.C:\DataCache\cache.db文件存在空文件也行☐dir C:\DataCache\cache.db4.SensorDriver.exe和DataBridgeService.exe已复制到服务器对应目录☐dir C:\Drivers\SensorDriver.exe等5.DataBridgeService已用InstallUtil.exe安装并设为自动启动☐services.msc中查看启动类型和状态6. IIS 中网站物理路径指向InfoPortal文件夹.NET 版本选 4.0☐IIS 管理器 → 网站 → 基本设置 → 物理路径高级设置 → .NET Framework 版本7.web.config中debugfalse且cacheDB连接字符串路径正确☐用记事本打开检查8. 浏览器访问http://localhost能看到首页即使数据为空☐实际打开测试表二功能演示脚本表共5个必演场景演示步骤预期现象备注场景1自动数据流验证1. 启动SensorDriver.exe2. 启动DataBridgeService3. 刷新Default.aspx页面每5秒新增一行传感器数据C:\DataQueue\raw_*.dat文件大小递增SensorDriver窗口应持续打印“Sent request”场景2人工发布验证1. 进入AdminPanel.aspx2. 输入标题“测试公告”、内容“这是人工发布”、选择分类“通知”、点击发布页面跳转回首页顶部出现新公告C:\DataCache\cache.db中manual_posts表新增一行检查 SQLite DB 用DB Browser for SQLite场景3置顶功能验证1. 发布第二条公告2. 编辑第一条公告勾选“置顶”3. 刷新首页第一条公告始终显示在“最新公告”区域最上方置顶只影响排序不影响发布时间显示场景4XSS 过滤验证1. 在公告内容输入scriptalert(1)/script2. 点击发布页面正常显示“ ”为纯文本无弹窗检查浏览器开发者工具 Elements 标签页确认 script 标签被移除场景5断网容灾验证1. 拔掉网线2. 启动SensorDriver.exe和DataBridgeService3. 等待2分钟4. 插回网线刷新首页首页仍能显示历史传感器数据和人工公告新数据在联网后自动补上证明 SQLite 本地缓存有效表三答辩问答预判表老师最可能问的6个问题你的标准答案要点关键数据/代码位置Q1为什么用 WebForms 而不用 MVC 或 Core“学校机房服务器是 Windows Server 2012只支持 .NET Framework且要求部署简单。WebForms 的.aspx页面可直接拷贝到 IIS 目录运行无需编译。”web.config第2行compilation targetFramework4.7.2Q2C 和 C# 如何保证数据不丢失“C 程序只写文件C# 服务监听文件变化。即使 C# 服务崩溃.dat文件仍在队列中重启后继续处理。我们测试过连续写入1000个文件无丢失。”C:\DataQueue\目录下文件数量统计Q3SQLite 并发读写如何处理“DataBridgeService写入用BEGIN IMMEDIATEWeb 端读取用READ UNCOMMITTED实测并发10用户无锁表现象。源码中GetNewRecords()方法第15行指定了隔离级别。”DataBridgeService/ModbusParser.cs第15行Q4如果传感器坏了系统怎么提示“SensorDriver.exe每次发送请求后等待 500ms 响应超时则写入C:\Logs\timeout.log。DataBridgeService每5分钟检查日志若连续3次超时向adminschool.edu.cn发邮件需配置 SMTP。”SensorDriver/sensor_driver.c第88行日志写入Q5人工公告的富文本编辑器是自己写的吗“不是。我们集成开源库TinyMCE 4.9.11版本锁定在lib/tinymce/目录。所有 JS/CSS 均本地化不引用 CDN确保离线可用。”Default.aspx第32行script srclib/tinymce/tinymce.min.js/scriptQ6毕业设计的创新点在哪里“不是算法创新而是工程创新1用 C 保底层硬件兼容性2用 C# 服务做协议桥接隔离不稳定因素3WebForms 做瘦客户端降低部署门槛。三者组合解决了‘老设备、新需求、旧环境’的典型矛盾。”对照README.md中“设计目标”章节5.2 答辩现场的两次黄金演示控制在8分钟内第一次演示3分钟证明系统能跑起来不解释原理只操作打开任务管理器 → 启动SensorDriver.exe窗口弹出打开服务管理器 → 启动DataBridgeService状态变“正在运行”打开浏览器 → 访问http://localhost→ 刷新三次指出传感器数据在动、公告在更新。话术“老师请看整个流程无需任何配置三步启动数据自动流动。”第二次演示5分钟证明你懂它为什么这样跑带老师看代码打开SensorDriver/sensor_driver.c指向第42行CreateFileA(COM3)“这里是我根据实验室设备实际串口号修改的”打开DataBridgeService/ModbusParser.cs指向第65行result.Temperature (float)(tempRaw / 10.0)“这是根据传感器手册第12页的缩放系数换算的”打开web.config指向第18行compilation debugfalse“这个开关关闭后IIS 才能高效编译页面”。话术“每一处修改都有依据不是凭空写的。”5.3 从那以后我每次交付毕设都强制走一遍“三表两演一习惯”那个“一习惯”就是永远在C:\Logs\下留一份deployment_log.txt记录每一次部署的时间、操作人、服务器 IP、遇到的问题及解决方式。不是为了应付检查而是当你在答辩现场被问“昨天部署时遇到什么问题”你能立刻打开这个文件指着某一行说“老师昨天下午3点17分我在 192.168.1.100 上发现NETWORK SERVICE权限缺失执行了icacls命令解决。”——这种颗粒度的掌控感比任何 PPT 都有说服力。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?