共计 8325 个字符,预计需要花费 21 分钟才能阅读完成。
提醒:本文最后更新于2025-07-07 14:54,文中所关联的信息可能已发生改变,请知悉!
从 windows Vista 开始,windows 系统提供了 WMIC(Windows Management Instrumentation Command Line)命令行工具,它可以通过 CMD 命令行命令方式来访问。
WMIC 支持的系统功能非常丰富,通过它可以获取到许多系统信息,也可以设置、修改、删除许多的系统功能设置。正因为 WMIC 如此强大,导致也很容易出现安全问题, Windows 10 以后正计划弃用该命令行工具,改为由 PowerShell 下的 wmi 取代相关功能。
通过 cmd 命令行工具调用,在任何编程语言中均可通过简单的调用 WMIC 以获取或设置系统信息。例如在 Node.js 中,可通过 exec
、spawn
方法对 WMIC 命令行功能进行调用。
1 WMIC 帮助信息
在 cmd 或 powershell 下执行 wmic /?
可获得 wmic 命令支持的全部功能摘要说明:
❯ wmic /? | |
WMIC 已弃用。 | |
[全局开关] <命令> | |
可以使用以下全局开关: | |
/NAMESPACE 别名在其上操作的命名空间的路径。 | |
/ROLE 包含别名定义的角色的路径。 | |
/NODE 别名在其上操作的服务器。 | |
/IMPLEVEL 客户端模拟级别。 | |
/AUTHLEVEL 客户端身份验证级别。 | |
/LOCALE 客户端应使用的语言 ID。 | |
/PRIVILEGES 启用或禁用所有权限。 | |
/TRACE 将调试信息输出到 stderr。 | |
/RECORD 记录所有输入命令和输出内容。 | |
/INTERACTIVE 设置或重置交互模式。 | |
/FAILFAST 设置或重置 FailFast 模式。 | |
/USER 会话期间要使用的用户。 | |
/PASSWORD 登录会话时要使用的密码。 | |
/OUTPUT 指定输出重定向模式。 | |
/APPEND 指定输出重定向模式。 | |
/AGGREGATE 设置或重置聚合模式。 | |
/AUTHORITY 指定连接的 <授权类型>。 | |
/?[:<BRIEF|FULL>] 用法信息。 | |
有关特定全局开关的详细信息,请键入: switch-name /? | |
按任意键可继续操作,或按 Esc 键停止操作 | |
当前角色中可以使用以下别名: | |
ALIAS - 对本地系统上可用别名的访问 | |
BASEBOARD - 基板(也称为主板或系统板)管理。 | |
BIOS - 基本输入/输出服务(BIOS)管理。 | |
BOOTCONFIG - 启动配置管理。 | |
CDROM - CD-ROM 管理。 | |
COMPUTERSYSTEM - 计算机系统管理。 | |
CPU - CPU 管理。 | |
CSPRODUCT - SMBIOS 中的计算机系统产品信息。 | |
DATAFILE - 数据文件管理。 | |
DCOMAPP - DCOM 应用程序管理。 | |
DESKTOP - 用户的桌面管理。 | |
DESKTOPMONITOR - 桌面监视器管理。 | |
DEVICEMEMORYADDRESS - 设备内存地址管理。 | |
DISKDRIVE - 物理磁盘驱动器管理。 | |
DISKQUOTA - 用于 NTFS 卷的磁盘空间使用量。 | |
DMACHANNEL - 直接内存访问(DMA)通道管理。 | |
ENVIRONMENT - 系统环境设置管理。 | |
FSDIR - 文件系统目录项管理。 | |
GROUP - 组帐户管理。 | |
IDECONTROLLER - IDE 控制器管理。 | |
IRQ - 中断请求线路(IRQ)管理。 | |
JOB - 提供对使用计划服务安排的作业的访问。 | |
LOADORDER - 定义执行依赖关系的系统服务的管理。 | |
LOGICALDISK - 本地存储设备管理。 | |
LOGON - 登录会话。 | |
MEMCACHE - 缓存内存管理。 | |
MEMORYCHIP - 内存芯片信息。 | |
MEMPHYSICAL - 计算机系统的物理内存管理。 | |
NETCLIENT - 网络客户端管理。 | |
NETLOGIN - 网络登录信息(属于特定用户)管理。 | |
NETPROTOCOL - 协议(及其网络特征)管理。 | |
NETUSE - 活动网络连接管理。 | |
NIC - 网络接口控制器(NIC)管理。 | |
NICCONFIG - 网络适配器管理。 | |
NTDOMAIN - NT 域管理。 | |
NTEVENT - NT 事件日志中的项目。 | |
NTEVENTLOG - NT 事件日志文件管理。 | |
ONBOARDDEVICE - 主板(系统板)中内置的通用适配器设备的管理。 | |
OS - 已安装操作系统的管理。 | |
PAGEFILE - 虚拟内存文件交换管理。 | |
PAGEFILESET - 页面文件设置管理。 | |
PARTITION - 物理磁盘的已分区区域的管理。 | |
PORT - I/O 端口管理。 | |
PORTCONNECTOR - 物理连接端口管理。 | |
PRINTER - 打印机设备管理。 | |
PRINTERCONFIG - 打印机设备配置管理。 | |
PRINTJOB - 打印作业管理。 | |
PROCESS - 进程管理。 | |
PRODUCT - 安装程序包任务管理。 | |
QFE - 快速修复工程。 | |
QUOTASETTING - 卷上的磁盘配额设置信息。 | |
RDACCOUNT - 远程桌面连接权限管理。 | |
RDNIC - 对特定网络适配器的远程桌面连接管理。 | |
RDPERMISSIONS - 特定远程桌面连接的权限。 | |
RDTOGGLE - 远程打开或关闭远程桌面侦听程序。 | |
RECOVEROS - 操作系统出现故障时将从内存收集的信息。 | |
REGISTRY - 计算机系统注册表管理。 | |
SCSICONTROLLER - SCSI 控制器管理。 | |
SERVER - 服务器信息管理。 | |
SERVICE - 服务应用程序管理。 | |
SHADOWCOPY - 卷影副本管理。 | |
SHADOWSTORAGE - 卷影副本存储区域管理。 | |
SHARE - 共享资源管理。 | |
SOFTWAREELEMENT - 系统上安装的软件产品元素的管理。 | |
SOFTWAREFEATURE - SoftwareElement 的软件产品子集的管理。 | |
SOUNDDEV - 声音设备管理。 | |
STARTUP - 当用户登录到计算机系统时自动运行的命令的管理。 | |
SYSACCOUNT - 系统帐户管理。 | |
SYSDRIVER - 基本服务的系统驱动程序管理。 | |
SYSTEMENCLOSURE - 物理系统外壳管理。 | |
SYSTEMSLOT - 物理连接点(包括端口、插槽和外设以及专用连接点)的管理。 | |
TAPEDRIVE - 磁带驱动器管理。 | |
TEMPERATURE - 温度传感器(电子温度计)数据管理。 | |
TIMEZONE - 时区数据管理。 | |
UPS - 不间断电源(UPS)管理。 | |
USERACCOUNT - 用户帐户管理。 | |
VOLTAGE - 电压传感器(电子电压表)数据管理。 | |
VOLUME - 本地存储卷管理。 | |
VOLUMEQUOTASETTING - 将磁盘配额设置与特定磁盘卷相关联。 | |
VOLUMEUSERQUOTA - 每用户存储卷配额管理。 | |
WMISET - WMI 服务操作参数管理。 | |
有关特定别名的详细信息,请键入: alias /? | |
CLASS - 按 Esc 键可获取完整 WMI 架构。 | |
PATH - 按 Esc 键可获取完整 WMI 对象路径。 | |
CONTEXT - 显示所有全局开关的状态。 | |
QUIT/EXIT - 退出程序。 | |
有关 CLASS/PATH/CONTEXT 的详细信息,请键入: (CLASS | PATH | CONTEXT) /? | |
2 WMIC 应用示例参考
2.1 进程管理(process)
获取进程信息
# 获取全部进程信息(类似 tasklist,但可以自定义获取的字段) | |
wmic process GET name,priority,threadcount,workingsetsize,parentprocessid,processid | |
# 条件获取进程信息:根据进程程序命令获取进程信息(当前进程 pid、父进程 ppid) | |
wmic process where name="chrome.exe" get name,processId,parentprocessId | |
# 获取指定应用进程占用的内存大小 | |
wmic process where caption='node.exe' get processId,WorkingSetSize,PeakWorkingSetSize | |
# 根据进程 pid 获取其父进程 ppid | |
wmic process where processid=8 get name,processId,parentprocessId | |
# 查找可疑进程 | |
wmic process where "name='explorer.exe' and ExecutablePath<>'%SystemDrive%\\windows\\explorer.exe'" get Name,ExecutablePath, CommandLine | |
# 杀死可疑进程 | |
wmic process where "name='explorer.exe' and ExecutablePath<>'%SystemDrive%\\windows\\explorer.exe'" delete | |
# 获取可执行文件列表 | |
wmic process where “NOT ExecutablePath LIKE ‘%Windows%’” GET ExecutablePath |
设置进程优先级
通过 CALL setpriority
可以提升进程优先级。但是需要注意,提升或降低进程优先级可能会导致应用甚至系统崩溃。
SetPriority
方法支持的优先级取值可为(字符或数字均可):
- Idle (64)
- Below Normal (16384)
- Normal (32)
- Above Normal (32768)
- High Priority (128)
- Realtime (256)
# 提升指定进程 id 的优先级 | |
wmic process where processid=8 CALL setpriority "Above normal" | |
# 提升指定应用程序名的进程优先级 | |
wmic process where name="chrome.exe" CALL setpriority 32768 | |
# 查看应用优先级 | |
wmic process where name="chrome.exe" GET name,priority |
应用优先级相关详细内容参考:
删除指定进程
wmic process where name="qq.exe" call terminate | |
# 或者使用 delete | |
wmic process where name="qq.exe" delete |
创建新进程
# 启动 qq | |
wmic process call create "C:\Program Files\Tencent\QQ\QQ.exe" | |
# 调用 shutdown.exe 实现关机 | |
wmic process call create shutdown.exe | |
# 调用 shutdown.exe 实现重启 | |
wmic process call create "shutdown.exe -r -f -m" | |
# 在远程机器上执行重启 | |
wmic /node:192.168.1.102/user:administrator /password:123456 process call create "shutdown.exe -r -f -m" |
2.2 用户账号管理(useraccount)
# 锁定本地指定的用户账号 | |
wmic useraccount where name='lzw.me' set disabled=true | |
# 用户账号重命名 | |
wmic useraccount where name='test' rename 'lzw.me' | |
# 限制指定账号修改密码 | |
wmic useraccount where name='lzw.me' set passwordchangeable=false |
2.3 磁盘管理
逻辑磁盘(logicaldisk)
# 获取逻辑磁盘盘简要信息 | |
wmic logicaldisk list brief | |
# 获取指定类型的逻辑磁盘信息 | |
wmic logicaldisk where drivetype=3 list brief | |
# 获取逻辑磁盘指定字段的信息 | |
wmic logicaldisk where drivetype=3 get deviceid,size,freespace,description,filesystem | |
# 条件过滤:只显示 D 盘的相关信息 | |
wmic logicaldisk where name="D:" get deviceid,size,freespace,description,filesystem | |
# 更改指定逻辑磁盘的卷标名 | |
wmic logicaldisk where name="c:" set volumename=lsxq | |
# 获得U盘的信息(drivetype=2) | |
wmic logicaldisk where drivetype=2 get deviceid,description |
物理硬盘(diskdrive)
# 获取物理硬盘信息 | |
wmic diskdrive list brief | |
# 获取物理磁盘的型号、大小 | |
wmic diskdrive get Caption,size,InterfaceType | |
# 获取物理硬盘序列号 | |
wmic diskdrive get SerialNumber,caption /format:list | |
# 其他获取硬盘序列号的方法 | |
wmic path win32_physicalmedia get SerialNumber | |
wmic path Win32_DiskDrive get SerialNumber,caption |
2.4 服务管理(service)
# 获取获取正在运行的服务列表 | |
wmic SERVICE where state='running' get caption,name,startmode | |
# 启动spooler服务 | |
wmic SERVICE where name="Spooler" call startservice | |
# 停止spooler服务 | |
wmic SERVICE where name="Spooler" call stopservice | |
# 暂停spooler服务 | |
wmic SERVICE where name="Spooler" call PauseService | |
# 更改spooler服务启动类型[auto|Disabled|Manual] 释[自动|禁用|手动] | |
wmic SERVICE where name="Spooler" set StartMode="auto" | |
# 删除指定的服务 | |
wmic SERVICE where name="testlzwme" call delete |
2.5 获取系统信息
# 内存芯片信息:内存大小、内存条序列号等 | |
wmic memorychip get speed,caption,PartNumber,SerialNumber,capacity | |
# 获取物理内存 | |
wmic memphysical list brief | |
# 获取内存缓存信息 | |
wmic memcache list brief | |
# 获取虚拟内存 | |
wmic pagefile list brief | |
# 获取 CPU 信息 | |
wmic cpu list brief | |
# 只返回 cpu 型号信息 | |
wmic cpu get name /format:list | |
# 获取网卡信息 | |
wmic nic list brief | |
# 获取网络协议 | |
wmic netprotocal list brief | |
# 系统 bios 信息 | |
wmic bios list brief | |
# 只获取 bios 序列号 | |
wmic bios get serialNumber /format:list | |
# 基板(也称为主板或系统板)信息 | |
wmic baseboard list brief | |
# 操作系统信息:可以得到系统的上一次启动时间、注册的用户数量、处理器数量、物理/虚拟内存信息和安装的操作系统类型等 | |
wmic os get /format:list | |
# 计算机系统信息:可以获取系统角色、用户名和制造商等信息 | |
wmic computersystem list brief /format:list | |
wmic computersystem get Name,Domain,Manufacturer,Model,Username,Roles /format:list | |
# 获取系统驱动详情:可以枚举出驱动的名称、路径和服务类型等 | |
wmic sysdriver get Caption, Name, PathName, ServiceType, State, Status |
2.6 其他示例参考
# 获取杀毒软件等反病毒应用信息,包括其名称、安装位置和版本 | |
wmic /namespace:\\root\securitycenter2 path antivirusproduct GET displayName,productState, pathToSignedProductExe | |
# 清理指定日志文件名的日志(需要管理员权限) | |
wmic nteventlog where filename='[logfilename]' cleareventlog | |
# 清理系统访问日志(需要管理员权限) | |
wmic nteventlog where filename='system' cleareventlog | |
# 判断目标系统是否为虚拟机:根据 Desciption 中的关键字可以得到一些信息 | |
wmic onboarddevice get Desciption, DeviceType, Enabled, Status /format:list | |
# 获取已安装的应用程序列表 | |
wmic product get name | |
# 获取SID | |
wmic group get Caption, InstallDate, LocalAccount, Domain, SID, Status | |
# 查看系统启动选项 | |
wmic startup list brief |
3 Node.js 执行脚本
Node.js 提供的 child_process
模块中,exec
和 execSync
方法可以实现对 cmd 命令行命令的调用。其中 execSync
方法通过同步调用返回,使用上比较简洁,但其返回值具有缓冲区大小限制,执行时间长、返回数据量大的命令执行更适合使用 exec
执行。示例:
const { execSync, exec } = require('child_process'); | |
const cmd = `wmic process GET name,priority,parentprocessid,processid`; | |
const output = execSync(cmd, 'utf8'); | |
console.log(output); | |
exec(cmd, (err, stdout) => { | |
if (err) console.log(err.message); | |
else console.log(stdout); | |
}); |
对于 powershell.exe
来说,可能需要调用的是一段脚本,那么可以借助 spawn
方法启动一个 powershell
实例来实现。示例:
function runWithPowerShell(commands = [`wmic process GET name,priority,parentprocessid,processid`]) { | |
return new Promise((resolve) => { | |
const { spawn } = require('child_process'); | |
const ps = spawn('powershell.exe', ['-Command', '-']); | |
const output = []; | |
const error = []; | |
ps.stdout.on('data', (buf) => output.push(buf.toString())); | |
ps.stdout.on('end', () => { | |
if (err.length) console.log(error.join('')); | |
if (output.length) console.log(output.join('')); | |
resolve({ output, error }); | |
}); | |
ps.stderr.on('data', (buf) => { | |
err.push(buf.toString()); | |
// reject(); | |
); | |
commands.forEach(cmd => ps.stdin.write(cmd + '\n')); | |
ps.stdin.end(); | |
}); | |
} | |
// 列出所有进程信息 | |
runWithPowerShell([`wmic process GET name,priority,parentprocessid,processid`]); | |
// 设置指定应用程序的优先级 | |
runWithPowerShell([`Get-WmiObject Win32_process -filter 'name="mspaint.exe"' | foreach-object { $_.SetPriority(32768) }`]); |
开源模块 node-powershell 是一个对 powershell
脚本执行的封装,核心原理也是利用 spawn
实现的。
4 相关参考
- https://docs.microsoft.com/zh-cn/windows/win32/wmisdk/wmic
- https://github.com/rannn505/node-powershell
- 比CMD更强大的命令行:WMIC后渗透利用(系统命令)
- Post Exploitation Using WMIC (System Command)