news 2026/11/3 2:58:02

WMI详解:Windows系统统一管理接口原理与实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WMI详解:Windows系统统一管理接口原理与实战

简介:本资源是微软官方发布的Windows Management Instrumentation(WMI)英文开发文档PDF合集,面向Windows系统开发人员、IT管理员及自动化运维工程师,用于深入理解WMI架构、类库体系与脚本开发实践。文档覆盖WMI核心概念(如提供程序/存储库/客户端关系)、对象模型(类、实例、属性、方法及其COM基础)、常用命名空间(如root\cimv2)与Win32系列关键类(Win32_OperatingSystem、Win32_Process等),并详解WQL查询语法及典型应用示例,支持PowerShell集成开发。资源为单文件PDF,体积57.3MB,内容完整、结构清晰,含首页导览、使用指南、参考手册与系统要求说明,适合作为开发查阅手册与进阶学习底稿。目前已有113人学习下载,是掌握Windows底层管理数据获取与远程自动化控制能力的重要技术资料。

1. WMI 到底是什么:一个 Windows 系统的“数字体检报告系统”

想象你刚买了一台新电脑,想快速知道它装了什么软件、CPU 正在忙什么、硬盘还剩多少空间、昨天有没有异常重启——你不用翻系统设置、不用打开任务管理器、更不用一条条查注册表。只要运行一段短短几行的代码,就能像查医院体检报告一样,把整台机器的“健康数据”“配置档案”“运行日志”全拉出来,还能远程查另一台办公室电脑的情况。这个能力,就来自 Windows 内置的WMI(Windows Management Instrumentation)。

它不是某个单独的软件,也不是要你手动安装的工具,而是 Windows 操作系统底层自带的一套“管理数据中枢”。就像人体有神经系统负责传递信号、内分泌系统负责协调功能,WMI 就是 Windows 的“管理神经系统”:它把硬件状态、服务开关、进程列表、网络配置、电源策略……所有这些原本散落在注册表、性能计数器、驱动接口、系统服务里的信息,统一翻译成标准格式,存进一个叫“WMI 存储库”的中央数据库,并提供一套通用语言(WQL)和通用接口(COM/.NET/PowerShell),让任何程序都能按需“问一句、得一答”。

很多人第一次听说 WMI,是因为 PowerShell 里那句Get-WmiObject Win32_OperatingSystem——但它远不止是 PowerShell 的一个命令。它是微软为整个 Windows 生态设计的“管理普通话”,是系统管理员写自动化脚本的基石,是安全软件扫描进程行为的通道,是监控平台采集服务器指标的源头,更是企业级运维系统背后沉默运转的“数据引擎”。搞懂它,不是为了背概念,而是为了真正看懂 Windows 这台机器——它在想什么、它在做什么、它怕什么、它能被要求做什么。


2. WMI 为什么存在:从“各说各话”到“统一语言”的必然选择

2.1 早期 Windows 管理有多混乱?

在 WMI 出现之前,想获取一台 Windows 电脑的信息,就像去不同科室挂号:

  • 查 CPU 使用率?得调用 Performance Counter API,一堆PdhOpenQuery、PdhAddCounter;
  • 查已安装软件?得去注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下逐个读键值;
  • 查网卡 IP?得调用GetAdaptersAddresses,处理复杂的结构体嵌套;
  • 查服务状态?得用OpenSCManager+OpenService+QueryServiceStatus三连击。

每种信息藏在不同地方、用不同方式访问、返回格式五花八门。写一个“检查服务器健康”的脚本?光是兼容 Windows Server 2003 和 XP 就可能要写两套逻辑。更别说跨版本、跨语言(C++ 脚本 vs VBScript)、跨远程(DCOM 配置像玄学)——开发成本高、维护难度大、出错难定位,成了系统管理领域的“血泪经验”。

提示:这不是夸张。某高校实验室曾为统一 50 台教学机的软件清单采集,用传统 API 写了 3 个版本脚本,最终因 Windows 7 UAC 权限问题全部失效,重写耗时两周。

2.2 WMI 怎么解决这个问题?

WMI 的核心思路很朴素:建一个“翻译中心”+“统一柜台”。
它不替代原有数据源,而是在上面加一层标准化封装:

原始数据源WMI 的封装方式开发者看到的样子
注册表软件列表Win32_Product类SELECT Name, Version FROM Win32_Product
性能计数器(CPU)Win32_PerfFormattedData_PerfOS_Processor类SELECT Name, PercentProcessorTime FROM Win32_PerfFormattedData_PerfOS_Processor
网络适配器配置Win32_NetworkAdapterConfiguration类SELECT IPAddress, IPSubnet, DNSServerSearchOrder FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE
服务状态Win32_Service类SELECT Name, State, StartMode FROM Win32_Service WHERE State = 'Running'

这个“翻译中心”就是WMI 提供程序(Provider)—— 它们是轻量级 DLL,由微软或硬件厂商编写,职责只有一个:把自家数据“说人话”(即转换成 CIM 标准对象)。而“统一柜台”就是WMI 存储库(Repository)—— 一个基于文件的数据库(%windir%\System32\wbem\Repository),存放所有类定义(schema)和部分静态实例。当你执行SELECT * FROM Win32_BIOS,WMI 并不直接读 BIOS 芯片,而是调用Win32_BIOS提供程序,后者再通过底层 Win32 API 或驱动接口实时获取并格式化返回。

这种设计带来三个关键好处:
✅语言无关:C++、C#、VBScript、PowerShell、甚至 Python(通过pywin32)都能用同一套类名和查询语法;
✅位置透明:本地查、远程查(通过 DCOM 或 WinRM),代码几乎一样;
✅版本兼容:新系统新增Win32_PhysicalMemory类,老脚本查Win32_OperatingSystem依然有效,互不干扰。

2.3 WMI 的技术底座:CIM + COM + MOF,缺一不可

WMI 不是微软闭门造车的产物,它的根基是两大行业标准:
🔹CIM(Common Information Model):由 DMTF(分布式管理任务组)制定的“IT 设备描述语言”。它定义了什么叫“操作系统”、什么叫“进程”、什么叫“磁盘”,用面向对象的方式抽象出通用属性(如Name,CreationDate,Status)和方法(如Terminate(),Reboot())。WMI 所有类(Win32_*,CIM_*)都是 CIM 模型的具体实现。打个比方:CIM 是《机动车登记规范》国家标准,WMI 就是各地车管所按该标准填写的电子档案系统。
🔹COM(Component Object Model):Windows 经典的二进制组件模型。WMI 接口(如IWbemServices,IWbemClassObject)全部基于 COM 实现,保证了高性能和跨语言调用能力。即使你用 C# 写,底层仍是 COM 对象在通信。

而MOF(Managed Object Format)文件,则是 WMI 的“配置说明书”。它用类似 C 语言的语法定义类结构,例如Win32_Process.mof文件里写着:

[Dynamic, Provider("CIMWin32"), ClassContext("root\\cimv2"), AMENDMENT] class Win32_Process : CIM_Process { [Key, Read] string Handle; [Read] string Name; [Read] uint64 CreationDate; [Read] uint32 ProcessId; [Write] uint32 Terminate(uint32 Reason = 0); };

这段代码告诉 WMI:“Win32_Process是一个动态类,由CIMWin32提供程序提供,属于root\cimv2命名空间,它有Handle(主键)、Name、CreationDate等只读属性,还有一个可调用的Terminate方法。”
开发者无需自己写 MOF(除非开发新提供程序),但理解它,就明白为什么Win32_Process一定有ProcessId属性、为什么Terminate()方法能被调用——因为 MOF 已经“立法”定义了规则。


3. WMI 的核心组成:命名空间、类、提供程序、存储库,四者如何协作?

3.1 命名空间(Namespace):WMI 的“行政区划”

WMI 不是把所有类塞进一个大仓库,而是按功能划分成多个逻辑区域,称为命名空间。最常用的是root\cimv2(CIM 第二版根命名空间),90% 的日常管理类都在这里:Win32_OperatingSystem,Win32_Process,Win32_Service……
其他重要命名空间包括:

  • root\default:存放基础类和__开头的系统类(如__NAMESPACE,__CLASS);
  • root\subscription:用于事件订阅(如“当新进程启动时通知我”);
  • root\securitycenter2:Windows 安全中心相关类(防病毒、防火墙状态);
  • root\virtualization\v2:Hyper-V 虚拟化管理类。

命名空间之间相互隔离,权限可独立设置。你可以给root\cimv2开放读取权限,但禁止对root\subscription写入,防止恶意脚本注册事件监听。这就像公司里财务部、人事部、技术部各有自己的办公区,门禁卡权限不同。

3.2 WMI 类(Class)与实例(Instance):数据的“模板”与“实体”

WMI 中的“类”(Class)不是编程语言里的 class,而是数据结构的模板。比如Win32_Process类定义了“进程”这个概念有哪些字段(Name,ProcessId,WorkingSetSize),但不包含具体数据。
而“实例”(Instance)才是真实存在的东西。当你运行notepad.exe,WMI 就会在root\cimv2命名空间下生成一个Win32_Process类的实例,其Name属性值为"notepad.exe",ProcessId为12345。
你可以用 WQL 查询所有实例:

-- 查询所有正在运行的进程(返回多个实例) SELECT Name, ProcessId, WorkingSetSize FROM Win32_Process -- 查询特定进程(返回单个实例) SELECT * FROM Win32_Process WHERE Name = 'chrome.exe'

注意:Win32_Process是动态类,每次查询都实时调用提供程序获取最新数据;而Win32_ComputerSystem是半静态类,大部分属性(如Manufacturer,Model)开机后基本不变,查询更快。

3.3 提供程序(Provider):WMI 的“数据搬运工”

提供程序是 WMI 的灵魂组件,没有它,WMI 就是空壳。它分为两类:
🔸系统提供程序:微软内置,覆盖绝大多数管理场景。例如:

  • CIMWin32:提供Win32_*系列类(操作系统、硬件、服务等);
  • WMIPerfInst:将性能计数器数据实时映射为 WMI 类(如Win32_PerfRawData_*);
  • StdRegProv:提供注册表读写能力(GetStringValue,CreateKey等方法),是脚本操作注册表的安全通道。

🔸第三方提供程序:由硬件厂商或软件开发商编写。例如:

  • 某品牌服务器的 RAID 卡驱动,会附带StorageVolumeProvider,暴露Win32_Volume类的扩展属性(如磁盘健康度、重建进度);
  • 某杀毒软件安装后,注册AntivirusProvider,提供Win32_AntiVirusProduct类,让管理员一键查全网终端防护状态。

提供程序以 DLL 形式存在(如%windir%\System32\wbem\cimwin32.dll),由wmiprvse.exe(WMI 提供程序宿主进程)按需加载。Windows 7 后引入“安全模式”和“兼容模式”,避免一个提供程序崩溃拖垮整个 WMI 服务——这是对早期“一个 DLL 崩溃,WMI 全挂”黑匣子问题的直接回应。

3.4 WMI 存储库(Repository):不只是“数据库”,更是“元数据中枢”

WMI 存储库(路径:%windir%\System32\wbem\Repository)常被误解为“存所有数据的地方”,其实它主要存两类东西:
1️⃣类定义(Schema):所有 MOF 文件编译后的二进制格式,即“有哪些类、每个类有哪些属性/方法/关系”;
2️⃣静态实例(Static Instances):极少部分不常变的数据,如Win32_ComputerSystem的Domain、TotalPhysicalMemory(物理内存总量)等。

⚠️ 关键点:绝大部分运行时数据(如当前进程列表、CPU 实时使用率)并不存于存储库中!它们由提供程序在查询时动态生成。存储库损坏(如因磁盘错误导致.mof编译失败)的典型症状是:Get-WmiObject Win32_Process报错 “Invalid class”,但Get-Process(PowerShell 原生命令)依然正常——因为后者不依赖 WMI 存储库。

修复存储库有标准流程:

# 1. 停止 WMI 服务 Stop-Service winmgmt -Force # 2. 重建存储库(会清空自定义类,但系统类自动恢复) cd %windir%\System32\wbem ren Repository Repository.old winmgmt /resetrepository # 3. 重启服务 Start-Service winmgmt

这个操作不会丢失你的业务数据(因为数据本就不在库里),只是重装“说明书”。


4. WMI 的易混概念辨析:别再把 WMI、PowerShell、COM、WinRM 搞混了

4.1 易混点 1:WMI 和 PowerShell 是什么关系?

❌ 错误认知:“PowerShell 就是 WMI 的外壳,WMI 是 PowerShell 的一部分。”
✅ 正确理解:PowerShell 是 WMI 的“最佳拍档”,但不是唯一入口。

  • WMI 是 Windows 底层服务(winmgmt服务),独立于 PowerShell 存在。Windows 2000 时代就有 VBScript 调用 WMI;
  • PowerShell 通过Get-WmiObject(旧版)、Get-CimInstance(新版)等 cmdlet 封装 WMI 调用,让语法更简洁、管道更流畅;
  • 但 C++ 程序可以直接调用CoCreateInstance创建IWbemLocator,完全绕过 PowerShell;Python 用wmi库也是直连 WMI COM 接口。
    👉 区分口诀:WMI 是“菜市场”,PowerShell 是“买菜APP”,你也可以自己骑车去市场(用 C++),或者让别人代购(用 Python)。

4.2 易混点 2:WMI 和 COM 是什么关系?

❌ 错误认知:“COM 是过时技术,WMI 早就不用它了。”
✅ 正确理解:WMI 的底层通信协议就是 COM,至今未变。

  • 所有 WMI 接口(IWbemServices,IWbemClassObject)都是 COM 接口;
  • 本地调用走进程内 COM(in-process),远程调用默认走 DCOM(Distributed COM);
  • Get-CimInstance在 PowerShell 3.0+ 默认使用CIM协议(基于 WS-Man),但底层仍兼容 COM,且Get-WmiObject一直用 COM。
    👉 关键事实:禁用 DCOM(如组策略关闭“启用 COM+ 网络访问”)会导致Get-WmiObject -ComputerName失败,但Get-CimInstance -ComputerName可能成功(如果 WinRM 已启用)——这正说明它们走的是不同协议栈。

4.3 易混点 3:WMI 和 WinRM(Windows Remote Management)是什么关系?

❌ 错误认知:“WinRM 是 WMI 的升级版,以后只用 WinRM。”
✅ 正确理解:WinRM 是 WMI 远程访问的“新通道”,不是替代品。

  • WMI 传统远程靠 DCOM,配置复杂(需开放 135、445 端口,调整 DCOM 权限,防火墙放行);
  • WinRM 提供基于 HTTP/HTTPS 的 SOAP 协议(WS-Management),端口 5985/5986,权限模型更清晰(基于 WinRM 配置),且支持 HTTPS 加密;
  • Get-CimInstance默认优先走 WinRM(如果目标机器启用),失败才回退 DCOM;Get-WmiObject仅走 DCOM。
    👉 场景对比:
    | 场景 | 推荐方式 | 原因说明 | |---------------------|------------------|----------------------------| | 企业内网,已部署 WinRM |Get-CimInstance| 安全、易配置、支持 HTTPS | | 临时排查,目标机未启 WinRM |Get-WmiObject| 无需额外服务,但需 DCOM 配置 | | 开发 C++ 客户端 | 直接 COM 调用 | 最高效,不依赖 PowerShell |

4.4 易混点 4:WMI 类(Win32_*)和 .NET 类(System.Diagnostics.Process)有什么区别?

❌ 错误认知:“.NET 类更现代,应该弃用 WMI 类。”
✅ 正确理解:二者定位不同,适用场景互补。

  • System.Diagnostics.Process是 .NET Framework 提供的进程管理封装,只能操作本机进程,功能聚焦(启动、停止、内存读取);
  • Win32_Process是 WMI 提供的跨平台、跨语言、跨机器的进程数据视图,可查远程、可查历史、可关联其他类(如Win32_Process→Win32_Thread→Win32_PerfFormattedData_PerfProc_Thread)。
    👉 举个例子:你想写一个“检测某进程是否在多台服务器上运行”的脚本:
  • 用 .NET:需在每台服务器上部署程序,或写 RPC 通信,工程量大;
  • 用 WMI:一行Get-CimInstance -ClassName Win32_Process -Filter "Name='app.exe'" -ComputerName $servers即可搞定。

4.5 易混点 5:WMI 和性能监视器(PerfMon)数据来源一样吗?

❌ 错误认知:“PerfMon 和 WMI 都是查性能,数据肯定一样。”
✅ 正确理解:WMI 是 PerfMon 的“上游数据源之一”,但非全部。

  • PerfMon 数据来自三类:① 性能计数器(Performance Counters);② WMI 性能类(如Win32_PerfFormattedData_PerfOS_Processor);③ ETW(事件追踪)日志;
  • WMI 性能类本身又分两种:
    ▪Win32_PerfRawData_*:原始计数器值(需公式计算,如(RawValue2 - RawValue1) / (Time2 - Time1));
    ▪Win32_PerfFormattedData_*:WMI 自动计算好的格式化值(如PercentProcessorTime直接是百分比)。
    👉 实测差异:PerfMon中“% Processor Time”和Get-CimInstance Win32_PerfFormattedData_PerfOS_Processor | Select PercentProcessorTime结果一致;但Win32_PerfRawData_PerfOS_Processor的PercentProcessorTime_Base字段是 0,需配合其他字段计算——这就是为什么初学者直接查 RawData 会“翻车”。

5. WMI 的实战边界:什么时候该用、什么时候该绕开?

5.1 该用 WMI 的 4 个典型场景

场景 1:跨版本、跨机器的标准化信息采集

这是 WMI 的“主场”。例如,某公司要统计全网 2000 台 Windows 电脑的:

  • 操作系统版本(Win32_OperatingSystem.Caption,Version);
  • 物理内存容量(Win32_ComputerSystem.TotalPhysicalMemory);
  • 已安装 .NET Framework 版本(Win32_Product.Name LIKE '%NET Framework%');
  • 磁盘剩余空间(Win32_Volume.FreeSpace)。

用 WMI 的优势立刻凸显:
✅ 一套脚本,Windows 7 到 Windows 11 全兼容(Win32_*类在所有版本均存在);
✅ 远程执行只需-ComputerName参数,无需在每台机器装客户端;
✅ 所有数据结构统一(都是对象属性),导出 CSV/Excel 极其方便。

对比方案:

  • 用systeminfo命令?输出是纯文本,解析困难,且不支持远程;
  • 用Get-ComputerInfo(PowerShell 5.1+)?Windows 7 不支持,且部分字段(如 .NET 版本)需额外逻辑。
场景 2:需要“关联查询”的复杂运维逻辑

WMI 的强项是类之间的关联关系。例如,查“哪些进程占用了超过 1GB 内存,并显示其所属用户”:

# 关联 Win32_Process 和 Win32_LogonSession + Win32_LoggedOnUser $processes = Get-CimInstance Win32_Process -Filter "WorkingSetSize > 1073741824" foreach ($p in $processes) { $session = Get-CimInstance Win32_LogonSession -Filter "LogonId = '$($p.SessionId)'" $user = Get-CimInstance Win32_LoggedOnUser -Filter "Antecedent = 'Win32_LogonSession.LogonId=$($session.LogonId)'" [PSCustomObject]@{ ProcessName = $p.Name WorkingSetMB = [math]::Round($p.WorkingSetSize / 1MB, 1) UserName = $user.Dependent.Split('\')[1] } }

这种跨表关联(类似 SQL JOIN),在原生 PowerShell cmdlet 中无法直接实现,必须靠 WMI 的 CIM 关系模型。

场景 3:需要调用“方法”而非只读取数据

WMI 类不仅有属性,还有可执行的方法。这是纯数据查询工具做不到的。例如:

  • 重启远程计算机:Invoke-CimMethod -ClassName Win32_OperatingSystem -MethodName Reboot -ComputerName Server01;
  • 终止顽固进程:Invoke-CimMethod -ClassName Win32_Process -MethodName Terminate -Arguments @{ProcessId=1234};
  • 启用/禁用网络适配器:Invoke-CimMethod -ClassName Win32_NetworkAdapter -MethodName Disable -Arguments @{Index=7}。
    这些操作在图形界面里要多次点击,在命令行里要记一堆 netsh 参数,而 WMI 用统一语法,一次到位。
场景 4:与企业级监控/管理平台集成

几乎所有主流 IT 管理平台(如 Zabbix、Nagios、SolarWinds、SCCM)都支持 WMI 作为数据采集协议。原因很简单:
✅ 协议开放:WMI 基于标准 DCOM/WinRM,无需厂商私有 SDK;
✅ 数据丰富:从硬件温度(Win32_TemperatureProbe)到 Exchange 邮箱大小(Exchange_Server类),覆盖面广;
✅ 安全可控:可通过 WMI 命名空间权限、DCOM 权限、WinRM 配置精细控制访问粒度。
如果你在开发一个监控代理,优先对接 WMI,比自己解析 PerfMon 日志或抓取 Event Log 高效得多。

5.2 该绕开 WMI 的 3 个危险信号

信号 1:追求极致性能,且只查本机少量数据

WMI 查询有固定开销:COM 初始化、提供程序加载、存储库查找、数据序列化。如果只是查本机当前 CPU 使用率,Get-Counter '\Processor(_Total)\% Processor Time'比Get-CimInstance Win32_PerfFormattedData_PerfOS_Processor快 3~5 倍。
✅ 替代方案:

  • 性能计数器(Get-Counter);
  • .NET 类(System.Diagnostics.PerformanceCounter);
  • 原生 Win32 API(GetSystemTimes)。
信号 2:需要毫秒级精度的实时事件响应

WMI 事件订阅(Register-CimIndicationEvent)延迟通常在 1~5 秒,不适合高频交易、工业控制等场景。
✅ 替代方案:

  • ETW(Event Tracing for Windows):纳秒级精度,Windows 内核级事件源;
  • Windows 事件日志(Get-WinEvent):对登录、服务启停等事件更及时;
  • 第三方消息队列(如 RabbitMQ)+ 自定义 Agent。
信号 3:目标环境严格限制 DCOM/WinRM,且无权限开通

某些金融、军工客户环境,出于安全策略禁用 DCOM(端口 135)和 WinRM(5985/5986),同时禁用 PowerShell 远程(PSRemoting)。此时 WMI 远程完全失效。
✅ 替代方案:

  • 基于 HTTP 的自定义 REST API(需在目标机部署轻量服务);
  • 文件共享 + 脚本轮询(如每分钟生成report.csv到\\server\share);
  • 使用受限协议如 SMB(Get-SmbShare)或 LDAP(域环境查计算机对象)。

5.3 一份真实的“踩坑清单”:我们团队的血泪教训

去年为某跨平台图像处理 Demo 做 Windows 环境兼容性检查,我们写了段 WMI 脚本查显卡型号:

# 原始写法(错误!) $gpu = Get-WmiObject Win32_VideoController | Where-Object {$_.Name -notmatch 'Microsoft'}

结果在 Windows 11 ARM64 设备上失败——因为Win32_VideoController类在 ARM64 上被移除,改用Win32_VideoControllerCapabilities。我们当时没查文档,硬编码导致整个部署流程中断。

后来重构为防御式写法:

# 改进后(健壮!) function Get-GPUInfo { # 优先尝试新类 $gpu = Get-CimInstance Win32_VideoControllerCapabilities -ErrorAction SilentlyContinue if ($gpu) { return $gpu } # 回退到旧类 $gpu = Get-CimInstance Win32_VideoController -ErrorAction SilentlyContinue if ($gpu) { return $gpu } # 最终回退:查注册表(总有办法) $regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}" Get-ChildItem $regPath -ErrorAction SilentlyContinue | ForEach-Object { $name = Get-ItemProperty "$($_.PSPath)\DeviceDesc" -ErrorAction SilentlyContinue if ($name.DeviceDesc -and $name.DeviceDesc -notmatch 'Microsoft') { return [PSCustomObject]@{Name = $name.DeviceDesc} } } }

从那以后我每次写 WMI 脚本,都强制走三步:
1️⃣ 查官方文档确认类在目标 OS 版本的可用性(Operating system availability of WMI components);
2️⃣ 用-ErrorAction SilentlyContinue包裹,永远不假设类一定存在;
3️⃣ 为关键逻辑准备至少一种降级方案(注册表、PowerShell 原生命令、文件解析)。

希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 2:58:02

YOLO目标检测课程设计:从Darknet训练到对比实验

简介:围绕YOLO展开的深度学习目标检测学习文档,面向刚接触计算机视觉、希望系统理清目标检测算法脉络的高校学生与算法入门开发者。内容从深度学习与目标检测的发展节点切入,依次介绍两阶段代表Faster R-CNN、单阶段代表SSD以及YOLO所依托的D…

作者头像 李华
网站建设 2026/11/3 2:56:44

C++算法学习之分支限界法的应用

前言 分支限界法(branch and bound)是一种在解空间树上做系统性搜索、并用「界函数」剪掉不可能产生最优解的分支的算法框架。它和回溯法(backtracking)经常被放在一起讲,但两者的搜索方式和目标并不相同:回…

作者头像 李华
网站建设 2026/11/3 2:54:32

1月AI×Bio赛事日历:从Kaggle质谱赛到蛋白设计挑战赛

11月AIBio赛事日历:从Kaggle质谱赛到蛋白设计挑战赛 从这一期开始,「AIBio 赛事」成为固定栏目:每周一档,上半场是赛事日历速递(本周 deadline、方向、适合人群),下半场挑一个当期赛事做 Baseli…

作者头像 李华
网站建设 2026/11/3 2:51:41

【紧急】JumpServer堡垒机被公布Access Key泄露漏洞,可以实现提权

结论先行该漏洞是 JumpServer 中一处两缺陷叠加的越权读取:低权限已登录用户通过 _relnot 反转查询条件,再通过 actioncreate 切换序列化器,可一次性获取全平台 Access Key 明文(含管理员与内部组件)。CVSS 8.8&#x…

作者头像 李华