当前位置: 首页 > article >正文

从Get-WmiObject到Get-CimInstance:PowerShell监控内存用法的‘新老司机’避坑指南

从Get-WmiObject到Get-CimInstancePowerShell监控内存用法的‘新老司机’避坑指南在Windows系统管理中监控服务器内存使用情况是日常运维的重要任务。对于习惯使用PowerShell的管理员来说Get-WmiObject曾是查询系统信息的瑞士军刀但随着技术演进微软已明确推荐使用更现代的Get-CimInstance替代传统WMI查询。本文将深入剖析两种方法的差异帮助开发者编写更健壮、更兼容的监控脚本。1. 技术演进为什么需要从WMI迁移到CIMWindows Management Instrumentation (WMI) 作为Windows系统管理的核心技术已有二十多年历史。Get-WmiObject作为PowerShell中访问WMI的经典命令被广泛用于查询系统信息包括内存使用情况。但随着技术发展WMI逐渐暴露出几个关键问题DCOM依赖传统WMI查询依赖DCOM协议需要开放135端口这在现代安全环境中越来越不受欢迎跨平台限制WMI是Windows专属技术无法适应混合云和多平台环境性能瓶颈DCOM协议开销较大在大规模查询时性能表现不佳Common Information Model (CIM) 是DMTF制定的行业标准微软通过Windows Remote Management (WinRM)实现了CIM标准。Get-CimInstance作为新一代查询命令具有显著优势# 传统WMI查询 Get-WmiObject -Class Win32_OperatingSystem # 现代CIM查询 Get-CimInstance -ClassName Win32_OperatingSystem提示从PowerShell 3.0开始微软就推荐使用CIM cmdlet未来投资将主要集中在CIM体系上2. 核心差异对比语法、性能与安全性2.1 基础语法对比虽然两种命令查询相同的信息但语法存在细微差别。以下是一个典型的内存查询示例# WMI方式 $wmi Get-WmiObject -Class Win32_OperatingSystem $wmi | Select-Object TotalVisibleMemorySize, FreePhysicalMemory # CIM方式 $cim Get-CimInstance -ClassName Win32_OperatingSystem $cim | Select-Object TotalVisibleMemorySize, FreePhysicalMemory关键差异点特性Get-WmiObjectGet-CimInstance协议DCOM (TCP 135)WinRM (TCP 5985)认证方式传统NTLM/Kerberos支持现代认证标准跨平台支持仅Windows支持跨平台返回对象类型ManagementObjectCimInstance默认本地查询需要-ComputerName参数自动处理本地/远程2.2 性能实测对比我们通过一个简单的测试脚本对比两种方式的性能差异# 测试WMI查询速度 Measure-Command { Get-WmiObject -Class Win32_OperatingSystem | Out-Null } # 测试CIM查询速度 Measure-Command { Get-CimInstance -ClassName Win32_OperatingSystem | Out-Null }在Windows Server 2019上的典型测试结果WMI本地查询平均200-300毫秒CIM本地查询平均50-100毫秒远程查询时CIM的性能优势更加明显2.3 安全配置差异WMI依赖DCOM协议需要在防火墙上开放135端口这在安全审计严格的场景下往往不被允许。而CIM使用WinRM协议默认使用5985端口HTTP或5986端口HTTPS更符合现代安全实践。启用WinRM服务CIM必需的命令Enable-PSRemoting -Force3. 实战构建健壮的内存监控函数结合两种技术的优缺点我们可以编写一个兼容性更好的内存监控函数。以下是支持新旧环境的实现方案function Get-SystemMemoryUsage { param( [string]$ComputerName $env:COMPUTERNAME, [switch]$UseLegacyWMI ) $params { ErrorAction Stop } if ($ComputerName -ne $env:COMPUTERNAME) { $params[ComputerName] $ComputerName } try { if ($UseLegacyWMI) { $os Get-WmiObject params -Class Win32_OperatingSystem } else { $os Get-CimInstance params -ClassName Win32_OperatingSystem } $memoryUsage [math]::Round( (($os.TotalVisibleMemorySize - $os.FreePhysicalMemory) / $os.TotalVisibleMemorySize * 100), 2 ) [PSCustomObject]{ ComputerName $ComputerName TotalMemoryMB [math]::Round($os.TotalVisibleMemorySize / 1KB, 2) FreeMemoryMB [math]::Round($os.FreePhysicalMemory / 1KB, 2) MemoryUsagePercent $memoryUsage Timestamp Get-Date } } catch { Write-Warning 无法查询 $ComputerName 的内存信息: $_ } }使用示例# 查询本地内存使用情况默认使用CIM Get-SystemMemoryUsage # 查询远程服务器使用CIM Get-SystemMemoryUsage -ComputerName SRV01 # 强制使用传统WMI方式 Get-SystemMemoryUsage -ComputerName SRV01 -UseLegacyWMI4. 高级技巧与疑难解答4.1 处理混合环境在企业环境中可能同时存在新旧服务器。以下函数可以自动检测最佳查询方式function Get-MemoryUsageSmart { param( [string[]]$ComputerNames ) foreach ($computer in $ComputerNames) { try { # 先尝试CIM方式 $result Get-SystemMemoryUsage -ComputerName $computer $result } catch { try { # CIM失败后回退到WMI Write-Warning CIM查询失败尝试WMI回退: $computer $result Get-SystemMemoryUsage -ComputerName $computer -UseLegacyWMI $result } catch { Write-Warning 无法查询 $computer 的内存信息: $_ } } } }4.2 进程内存监控实现以下是一个使用CIM查询进程内存的示例按内存使用量排序function Get-TopProcesses { param( [int]$Top 10, [string]$ComputerName $env:COMPUTERNAME ) $processes Get-CimInstance -ClassName Win32_Process -ComputerName $ComputerName $processes | Sort-Object -Property WorkingSetSize -Descending | Select-Object -First $Top ProcessId, Name, {NameMemoryMB;Expression{[math]::Round($_.WorkingSetSize / 1MB, 2)}} }4.3 常见错误处理WinRM未启用目标计算机需要启用PSRemoting运行Enable-PSRemoting权限不足确保使用有管理员权限的账户防火墙阻止检查5985/5986端口是否开放双跳问题在远程会话中再访问其他服务器时可能需要CredSSP处理认证问题的示例$cred Get-Credential $session New-CimSession -ComputerName SRV01 -Credential $cred Get-CimInstance -ClassName Win32_OperatingSystem -CimSession $session Remove-CimSession -CimSession $session在实际项目中我发现将CIM查询封装为函数并添加适当的错误处理可以显著提高脚本的可靠性。特别是在大规模环境部署时CIM的稳定性和性能优势更加明显。

相关文章:

从Get-WmiObject到Get-CimInstance:PowerShell监控内存用法的‘新老司机’避坑指南

从Get-WmiObject到Get-CimInstance:PowerShell监控内存用法的‘新老司机’避坑指南 在Windows系统管理中,监控服务器内存使用情况是日常运维的重要任务。对于习惯使用PowerShell的管理员来说,Get-WmiObject曾是查询系统信息的"瑞士军刀&…...

Cursor Pro激活方案终极指南:三步实现永久免费使用AI编程助手

Cursor Pro激活方案终极指南:三步实现永久免费使用AI编程助手 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached y…...

一次讲清:华为网络中的‘MSTP负载’与‘VRRP主备’到底怎么配合才不冲突?

华为网络架构中MSTP与VRRP的协同设计与故障规避实战 在复杂的网络架构设计中,二层环路防护与三层网关冗余是保障业务连续性的两大基石。当MSTP(多生成树协议)与VRRP(虚拟路由冗余协议)在同一网络中部署时,若…...

告别手动delete!用Qt6的QScopedPointer轻松管理QTimer对象(附完整代码示例)

告别手动delete!用Qt6的QScopedPointer轻松管理QTimer对象(附完整代码示例) 在C开发中,内存管理一直是个令人头疼的问题。特别是对于Qt开发者来说,频繁创建的QObject派生类对象如果处理不当,很容易导致内存…...

八大网盘直链获取:从等待到掌控的下载体验蜕变

八大网盘直链获取:从等待到掌控的下载体验蜕变 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / …...

题解:AtCoder AT_awc0006_b Efficient Quests

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…...

PHP 9.0异步AI机器人开发全链路避坑指南(从Composer.lock锁死到OpenAI流式响应中断的终极解法)

更多请点击: https://intelliparadigm.com 第一章:PHP 9.0异步AI机器人开发的范式跃迁与认知重构 PHP 9.0 并非简单语法升级,而是以原生协程引擎、零拷贝流式 I/O 和内置 AI 推理上下文(AIC)为基石,重构了…...

《Foundation 按钮组》

《Foundation 按钮组》 引言 在网页设计中,按钮是用户与网站交互的重要元素。一个设计精良的按钮组可以显著提升用户体验,增强网站的功能性。本文将深入探讨Foundation框架中的按钮组,分析其设计原则、使用方法以及在实际项目中的应用。 一、Foundation 按钮组概述 Foun…...

终极便携式Windows C/C++开发套件:w64devkit完整指南

终极便携式Windows C/C开发套件:w64devkit完整指南 【免费下载链接】w64devkit Portable C and C Development Kit for x64 (and x86) Windows 项目地址: https://gitcode.com/gh_mirrors/w6/w64devkit w64devkit是一款专为Windows平台设计的便携式C/C开发工…...

从LiDAR扫描到3D打印:CloudCompare点云缩放与平移的完整预处理指南

从LiDAR扫描到3D打印:CloudCompare点云缩放与平移的完整预处理指南 当无人机掠过古建筑穹顶,或激光扫描仪在产品原型表面划过时,海量的空间坐标点被记录下来——这就是点云数据的诞生。但这些原始数据就像刚出土的矿石,需要经过切…...

4.26华为OD机试真题 新系统 - 项目模块依赖构建顺序规划 (Java/Py/C/C++/Js/Go)

项目模块依赖构建顺序规划 2026 华为OD机试真题 4月26日华为OD上机新系统考试真题 200 分题型 点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解 题目描述 某公司正在开发一个大型软件系统,系统包含…...

告别命令行恐惧:用 Ultralytics YOLOv8 Python API 在 Jupyter Notebook 里训练你的第一个检测模型

告别命令行恐惧:用 Ultralytics YOLOv8 Python API 在 Jupyter Notebook 里训练你的第一个检测模型 对于许多数据分析师和研究者来说,命令行界面常常是深度学习入门的第一道门槛。那些复杂的参数和黑底白字的终端窗口,让不少习惯交互式编程的…...

Gin项目参数校验踩坑实录:从`required`失效到`dive`标签的正确用法

Gin项目参数校验踩坑实录:从required失效到dive标签的正确用法 那天下午,服务器突然开始频繁返回400错误。日志里堆满了"Key: PostAttributeValuesReq.Values[0].Value Error:Field validation for Value failed on the required tag"这样的报…...

Scikit-learn 机器学习库使用指南

Scikit-learn 机器学习库使用指南 在当今数据驱动的时代,机器学习已成为解决复杂问题的核心工具之一。而Scikit-learn作为Python中最受欢迎的机器学习库之一,以其简洁的API、丰富的算法和高效的性能赢得了广泛认可。无论是初学者还是经验丰富的数据科学…...

【软考高级架构】案例题考前突击4——云原生架构

【软考高级架构】案例题考前突击4——云原生架构 ========== 概念讲解 ========== (一)云原生架构定义 云原生(Cloud Native)架构是基于云原生技术的一组架构原则和设计模式的集合,旨在将云应用中的非业务代码部分进行最大化的剥离,从而让云设施接管应用中原有的大量非功…...

构建AI智能体本地记忆中枢:解决多工具知识孤岛与架构漂移

1. 项目概述:为AI智能体构建一个“不会遗忘”的本地记忆中枢 如果你和我一样,日常开发中同时用着Claude Code、Cursor、Windsurf这些不同的AI编程助手,那你一定遇到过这个痛点:在Claude里刚讨论完的API设计决策,切换到…...

从sysfs目录看Linux设备模型:一个‘ls /sys’命令背后的kobject、kset与ktype故事

从/sys目录透视Linux设备模型:kobject、kset与ktype的实战解析 当你第一次在Linux终端中输入ls /sys时,那些层次分明的目录结构可能看起来像普通的文件夹。但事实上,这个看似简单的文件系统背后隐藏着Linux设备模型的核心机制——kobject、ks…...

【软考高级架构】案例题考前突击5——特定领域软件体系结构构

特定领域软件体系结构构(Domain-SpecificSoftwareArchitecture,DSSA) 概念讲解 (一)定义: DSSA(Domain Specific Software Architecture) 就是在一个特定应用领域中为一组应用提供组织结构参考的标准软件体…...

如何轻松管理游戏DLSS文件?DLSS Swapper终极指南让你一键搞定

如何轻松管理游戏DLSS文件?DLSS Swapper终极指南让你一键搞定 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在为手动替换游戏DLSS文件而烦恼吗?DLSS Swapper正是你需要的智能解决方案&#…...

“PHP不能做AI”是最大谎言!PHP 9.0异步生态已支持OpenAI v1.42+Ollama+Llama.cpp直连,附12个可运行Demo仓库链接(限时开放48小时)

更多请点击: https://intelliparadigm.com 第一章:PHP 9.0异步编程与AI聊天机器人如何实现快速接入 PHP 9.0 引入了原生协程(Native Coroutines)与 async/await 语法支持,配合事件驱动运行时(如 Swoole 5.…...

PHP Swoole集成大模型服务的长连接架构设计(2024生产环境已验证的5层容错模型)

更多请点击: https://intelliparadigm.com 第一章:PHP Swoole集成大模型服务的长连接架构设计(2024生产环境已验证的5层容错模型) 在高并发AI服务场景中,传统HTTP短连接无法承载LLM推理会话的持续性与低延迟要求。我们…...

STM32的USB CDC和硬件串口Serial,我该用哪个?Arduino代码移植避坑指南

STM32的USB CDC与硬件串口技术选型指南:从Arduino移植到实战优化 当你第一次将Arduino代码移植到STM32平台时,最令人困惑的问题之一可能就是:该用USB虚拟串口(CDC)还是硬件串口(UART)?这个看似简单的选择背后,实际上涉…...

PyOneDark主题终极指南:5分钟打造现代化Qt专业界面

PyOneDark主题终极指南:5分钟打造现代化Qt专业界面 【免费下载链接】PyOneDark_Qt_Widgets_Modern_GUI 项目地址: https://gitcode.com/gh_mirrors/py/PyOneDark_Qt_Widgets_Modern_GUI 想要为你的Python Qt应用打造令人惊艳的现代化深色界面吗?…...

STM32G474VCT6 高性能微控制器 M4内核+HRTIM+数学加速器——ST意法半导体 芯片IC

STMicroelectronics(意法半导体)推出的STM32G474VCT6高性能微控制器,正是为破解这一困局而生。作为新一代G4系列的核心型号,它基于Arm Cortex-M4内核(带FPU和DSP扩展),最高运行频率达170 MHz&am…...

告别环境变量配置烦恼:在openKylin 2.0上,用apt命令一键安装Java 11(附版本切换指南)

告别环境变量配置烦恼:在openKylin 2.0上,用apt命令一键安装Java 11(附版本切换指南) 如果你是一名长期在Linux环境下工作的开发者,大概率经历过手动配置Java环境的繁琐过程:下载tar包、解压到特定目录、修…...

PyTorch训练中遇到Double和Float类型不匹配?别慌,这3种方法帮你快速定位和修复

PyTorch数据类型冲突排查指南:从报错信息到精准修复的完整路径 当你正在全神贯注地调试PyTorch模型,突然屏幕上跳出"RuntimeError: expected scalar type Double but found Float"这样的错误信息时,那种感觉就像在高速公路上突然爆…...

ARM调试寄存器DLR与DSPSR深度解析

1. ARM调试寄存器概述在ARM架构的调试子系统中,调试寄存器扮演着核心角色。作为一位长期从事ARM底层开发的工程师,我经常需要与这些寄存器打交道。调试寄存器主要用于在处理器进入调试状态时保存关键上下文信息,确保调试结束后能够正确恢复执…...

高速PCB堆叠设计:信号完整性与EMI优化实践

1. 高速PCB堆叠设计的核心价值在当今高速数字系统设计中,PCB堆叠设计已经从单纯的机械结构规划转变为影响系统性能的关键因素。随着IC边缘速率进入亚纳秒级(如100ps级别的多千兆位收发器),传统的"先画板再调"方法已经无…...

DL24MP-150W蓝牙电池测试仪功能解析与实测指南

1. DL24MP-150W蓝牙电池测试仪深度评测作为一名电子工程师,我经常需要测试各种电池的性能参数。传统万用表虽然能快速测量电压,但对于电池容量、内阻等关键指标的测试就显得力不从心。最近入手了一款DL24MP-150W蓝牙电池测试仪,它集成了可编程…...

云原生应用测试策略:从单元测试到端到端测试

云原生应用测试策略:从单元测试到端到端测试 一、云原生测试的概念与价值 1.1 云原生测试的定义 云原生测试是针对云原生应用的测试策略和方法,它考虑了容器化、微服务架构、动态伸缩等云原生特性,旨在确保应用在云环境中的可靠性、性能和安全…...