上一篇讲文件和目录,这一篇讲「机器现在是什么状态」:装的是什么系统、谁在登录、哪些进程在跑、哪些服务该启动、计划任务在哪、注册表某个键是什么值。
这类命令的用途很集中——出故障时看现场、给远程机器做排查、给批处理提供判断依据。表里的语法与参数名同样照微软官方 Windows Commands 参考抄录,出处列在文末。
一、系统与硬件信息
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
systeminfo |
输出系统配置、安全信息、产品 ID、硬件属性(内存、磁盘空间、网卡等) | systeminfo [/s <computer>] [/fo {TABLE | LIST | CSV}] [/nh] |
systeminfo /fo list |
hostname |
只输出计算机名(完整名称的主机名部分) | hostname |
hostname |
whoami |
显示当前登录用户的域和用户名 | whoami [/upn | /fqdn | /logonid] |
whoami |
ver |
显示操作系统版本号 | ver |
ver |
wmic |
在交互式命令行里取 WMI 信息 | wmic <参数> |
wmic logicaldisk get name |
driverquery |
列出已安装的驱动及其属性 | driverquery [/fo {table | list | csv}] [/nh] [/v | /si] |
driverquery /fo csv /nh |
systeminfo 默认输出量很大,要挑着看格式就加 /fo list(竖排,一行一个字段)或 /fo csv(方便导进表格工具),/nh 去掉表头。远程抓取靠 /s <computer>,再配合 /u、/p 指定凭据。
whoami 单独敲只给一行 域名\用户名(本机账户是 计算机名\用户名)。要看得更细用这些开关:
| 开关 | 输出 |
|---|---|
/upn |
用户主体名称(UPN)形式的用户名 |
/fqdn |
完全限定域名(FQDN)形式的用户名 |
/logonid |
当前用户的登录 ID |
/user |
当前域和用户名,以及账户的 SID |
/groups |
当前用户所属的用户组 |
/privileges |
当前用户持有的安全特权 |
/claims |
当前用户的声明信息 |
/all |
把上面这些一次全列出来 |
/fo <format> / /nh |
指定输出格式 / 去掉列标题 |
driverquery 加 /v 会输出详细信息(此时不能用 /si),/si 只列已签名驱动的信息,排查「某个驱动是哪个版本、有没有签名」时用它最快。
关于 wmic 有个必须知道的事:官方参考页面顶部写着 WMIC 自 Windows 10 版本 21H1 起、以及 Windows Server 21H1 半年通道版本起已弃用,由 PowerShell 的 WMI 支持取代(被弃用的只是命令行工具 WMIC,WMI 机制本身不受影响)。老脚本里的 wmic 现在还能跑,但新写的东西建议直接用 PowerShell 的 Get-CimInstance,这一句的出处见文末 wmic 页面。
wmic 的常用子命令(官方页面列的):logicaldisk 显示逻辑磁盘属性,class 和 path 用来跳出默认别名模式直接访问 WMI 类,context 显示所有全局开关的当前值。典型用法是 wmic logicaldisk get name 只列出盘符。
二、进程
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
tasklist |
列出本机或远程机器上正在运行的进程 | tasklist [/s <computer>] [{/m <module> | /svc | /v}] [/fo {table | list | csv}] [/nh] [/fi <filter>] |
tasklist /v /fi "PID gt 1000" /fo csv |
taskkill |
结束一个或多个进程(按 PID 或映像名) | taskkill [/s <computer>] {[/fi <filter>] [...] [/pid <processID> | /im <imagename>]} [/f] [/t] |
taskkill /pid 1230 /pid 1241 /pid 1253 |
tskill |
结束远程桌面会话里的某个进程 | tskill {<processID> | <processname>} [/server:<servername>] [/id:<sessionID> | /a] [/v] |
tskill explorer /id:5 |
query process / qprocess |
查看远程桌面会话主机上运行着哪些进程、分别属于哪个用户 | query process [* | <processID> | <username> | <sessionname> | /id:<nn> | <programname>] |
query process /ID:2 |
wmic process |
取进程的 WMI 属性(命令行、父进程、启动时间等) | wmic process get name,processid |
wmic process get name,processid |
tasklist 有两个参数在排查时特别好用:/svc 会显示每个进程里承载了哪些服务(找「是谁占着这个服务」时一步到位),/m <module> 按「哪个进程加载了某个 DLL」过滤(排查 DLL 占用、被锁文件时用)。
/fi 是过滤器,官方给了完整的可用字段与运算符:
| 过滤字段 | 可用运算符 | 可用值 |
|---|---|---|
STATUS |
eq、ne | RUNNING、NOT RESPONDING、UNKNOWN(指定远程系统时不支持) |
IMAGENAME |
eq、ne | 映像名 |
PID |
eq、ne、gt、lt、ge、le | PID 数值 |
SESSION |
eq、ne、gt、lt、ge、le | 会话号 |
SESSIONNAME |
eq、ne | 会话名 |
CPUTIME |
eq、ne、gt、lt、ge、le | HH:MM:SS 格式的 CPU 时间 |
MEMUSAGE |
eq、ne、gt、lt、ge、le | 内存占用,单位 KB |
USERNAME |
eq、ne | 用户名或 域名\用户名 |
SERVICES |
eq、ne | 服务名 |
WINDOWTITLE |
eq、ne | 窗口标题(指定远程系统时不支持) |
MODULES |
eq、ne | DLL 名称 |
taskkill 的两组开关要分清楚:/pid 按进程 ID 杀、/im 按映像名杀,两个必须挑一个;/f 是强制结束,/t 是连子进程一起结束。官方示例里 taskkill /f /fi "USERNAME eq NT AUTHORITY\SYSTEM" /im notepad.exe 这种组合就是「只杀属于某个用户的某个程序」。
tskill 和 taskkill 的区别在于会话:tskill 面向远程桌面会话主机,/id:<sessionID> 指定会话、/a 表示所有会话。
三、服务
官方 Windows Commands 参考里收录的 sc.exe 子命令是 query、config、create、delete 这四个(其余子命令用 sc.exe /? 在现场看)。
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
sc.exe query |
查询指定服务的状态、类型等信息 | sc.exe [<servername>] query [<servicename>] [type= {driver | service | all}] [state= {active | inactive | all}] |
sc.exe query |
sc.exe config |
修改服务的配置(启动类型、可执行文件路径、依赖等) | sc.exe config [<servicename>] [start= {boot | system | auto | demand | disabled | delayed-auto}] |
sc.exe config NewService binpath= c:\windows\system32\NewServ.exe |
sc.exe create |
在注册表和 SCM 数据库里创建服务项 | sc.exe [<servername>] create [<servicename>] [binpath= <binarypathname>] [type= {own | share}] [start= ...] |
sc.exe create NewService binpath= c:\windows\system32\NewServ.exe type= share start= auto |
sc.exe delete |
删除服务的注册表子键 | sc <server> delete [service name] |
sc delete NewServ |
几个官方文档里的细节值得单独记一下:
sc query不带服务名时会枚举所有服务;输出被截断时(会出现类似Enum: more data, need 1822 bytes start resume at index 79的提示)按提示带上bufsize=和ri=重跑就能接着看,例如sc.exe query bufsize= 1822 ri= 79。sc config里的start=值:boot、system、auto、demand、disabled、delayed-auto——demand是手动启动,disabled是禁用。sc delete删除正在运行的服务(或还有进程持有句柄)时,服务只是被标记为待删除,要等它停下来才会真正消失。- 写
sc参数时等号后面那个空格不能省(binpath= C:\...),这是sc.exe自己的语法习惯。
四、登录会话与注销
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
query user |
查看远程桌面会话主机上的用户会话 | query user [<username> | <sessionname> | <sessionID>] [/server:<servername>] |
query user USER1 /server:Server1 |
query session |
查看服务器上的会话列表(含活动之外的各种会话) | query session [<sessionname> | <username> | <sessionID>] [/server:<servername>] [/mode] [/flow] [/connect] [/counter] |
query session |
quser |
与 query user 同功能的短命令 |
quser [<username> | <sessionname> | <sessionID>] |
quser |
qwinsta |
与 query session 同功能的短命令 |
qwinsta [<sessionname> | <username> | <sessionID>] [/mode] [/flow] [/connect] [/counter] |
qwinsta |
logoff |
注销某个会话并删除该会话 | logoff [<sessionname> | <sessionID>] [/server:<servername>] [/v] |
logoff 12 |
qwinsta 的典型输出长这样(官方示例):列出 SESSIONNAME、USERNAME、ID、STATE、TYPE、DEVICE 六列,STATE 是 active、listen、idle 这类状态。找「谁占着这台机器的会话」就看这个表,logoff <sessionID> 就能把指定会话踢掉。/counter 会附带会话的计数器信息。
五、计划任务
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
schtasks /query |
列出计算机上计划运行的任务 | schtasks [/query] [/fo {TABLE | LIST | CSV}] [/nh] [/v] [/tn <taskname>] [/xml] |
schtasks /query /fo LIST /v |
schtasks /create |
新建计划任务 | schtasks /create /sc <scheduletype> /tn <taskname> /tr <taskrun> |
schtasks /create /sc minute /mo 20 /tn "Security Script" /tr D:\scripts\sec.vbs |
schtasks /change |
修改已有任务的属性 | schtasks /change /tn <Taskname> [/{ENABLE | DISABLE}] |
schtasks /change /tn Virus Check /tr C:\VirusCheck2.exe |
schtasks /run |
立即启动某个任务(忽略它的计划时间) | schtasks /run /tn <taskname> |
schtasks /run /tn "Security Script" |
schtasks /end |
结束由该任务启动的程序实例 | schtasks /end /tn <taskname> |
schtasks /end /tn "My Notepad" |
schtasks /delete |
删除计划任务(不删任务里那个程序,也不中断正在运行的程序) | schtasks /delete /tn {<taskname> | *} [/f] |
schtasks /delete /tn "Start Mail" /s Svr16 |
at |
在指定时间点运行命令或程序(需要计划服务在运行) | at [\computername] <time> [/interactive] [/every:date[,...]] <command> |
at 4:30pm /every:F "net send group leads status due" |
/sc 支持的计划类型(官方列出的值):
| 取值 | 含义 |
|---|---|
MINUTE |
按分钟间隔重复 |
HOURLY |
按小时间隔重复 |
DAILY |
按天间隔重复 |
WEEKLY |
按周间隔重复 |
MONTHLY |
按月间隔重复 |
ONCE |
在指定的日期和时间运行一次 |
ONSTART |
每次系统启动时运行 |
ONLOGON |
任意用户登录时运行 |
ONIDLE |
系统空闲时运行 |
ONEVENT |
由指定的事件触发 |
几个实用组合:/mo 是间隔修饰符(/sc minute /mo 20 就是每 20 分钟)、/st 指定开始时间、/et 指定结束时间、/k 表示到点了就结束程序、/ru 和 /rp 指定任务以哪个账户运行,/rl 指定运行级别。
schtasks /query /fo CSV /nh >> D:\tasklogs\log.csv 这种写法可以把任务清单持续追加到一个 CSV 里(官方示例就是这么干的),用来做「任务有没有被人改动」的巡检。
schtasks /end 只能结束由任务启动的程序实例,要结束别的进程得换 taskkill——这句是官方页面里点明的分工。
六、注册表
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
reg query |
列出指定子键下的子键与值 | reg query <keyname> [{/v <valuename> | /ve}] [/s] [/f <data>] [{/k | /d}] [/c] [/e] [/t <Type>] [/reg:32] |
reg query HKLM\Software\Microsoft\ResKit /v Version |
reg add |
新增子键或值项 | reg add <keyname> [/v valuename | /ve] [/t datatype] [/d data] [/f] |
reg add HKLM\Software\MyCo /v Data /t REG_BINARY /d fe340ead |
reg delete |
删除子键或值项 | reg delete <keyname> [{/v valuename | /ve | /va}] [/f] |
reg delete HKLM\Software\MyCo /v Data /f |
reg export |
把指定子键导出成 .reg 文件 | reg export <keyname> <filename> [/y] |
reg export HKLM\Software\MyCo\MyApp AppBkUp.reg |
reg import |
把 .reg 文件的内容导入本机注册表 | reg import <filename> |
reg import AppBkUp.reg |
reg copy |
把一个子键复制到另一个子键 | reg copy <keyname1> <keyname2> [/s] [/f] |
reg copy HKLM\Software\MyCo HKLM\Software\MyCoCopy /s /f |
reg compare |
比较两个子键的差异 | reg compare <keyname1> <keyname2> [/s] |
reg compare HKLM\Software\MyCo HKLM\Software\MyCoCopy |
用之前必须先弄清根键:本机可用的根键是 HKLM、HKCU、HKCR、HKU、HKCC;指定远程计算机时只有 HKLM 和 HKU 可用。远程写法是把计算机名拼进键路径,形如 \<computername>\HKLM\...。
键名里有空格要用引号括起来。reg query 的 /s 会递归查所有子键和值,/f <data> 按内容或模式过滤,/c 让过滤区分大小写,/e 只要完全匹配。/reg:32 和 /reg:64 用来指定访问 32 位还是 64 位注册表视图——在 64 位系统上排查「明明导入了但程序读不到」这类问题时,这一条经常是原因。
reg add 和 reg import 的返回值:0 表示成功,1 表示失败。
导出/导入是改注册表之前最省事的保险:reg export <键> 备份.reg 先留一份,改坏了双击还原或 reg import 回去。
七、组策略、电源与安装包
| 命令 | 作用 | 基本写法 | 示例 |
|---|---|---|---|
gpresult |
显示远程用户和计算机的组策略结果集(RSoP) | gpresult [/s <system>] [/user [<targetdomain>\]<targetuser>] [/scope {user | computer}] {/r | /v | /z | [/x | /h] <filename>} |
gpresult /r |
gpupdate |
立即刷新组策略设置 | gpupdate [/target:{computer | user}] [/force] [/wait:<VALUE>] [/logoff] [/boot] [/sync] |
gpupdate /force |
shutdown |
关机、重启、休眠、注销本地或远程计算机 | shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/fw] [/f] [/m \computer] [/t xxx] |
shutdown /r /t 60 /c "重启通知" /f |
msiexec |
安装、卸载、修复 MSI 安装包 | msiexec.exe [/i][/a][/j{u|m|/g|/t}][/x] <path_to_package> |
msiexec.exe /i "C:\example.msi" |
rundll32 |
调用按 Rundll32 规范编写的 DLL 里的函数 | rundll32 <DLLname> |
rundll32 printui.dll,PrintUIEntry |
verifier |
驱动验证程序管理器,用于验证驱动程序 | verifier /standard /all |
verifier /query |
gpresult /r 是显示 RSoP 摘要、/v 显示详细策略信息、/z 显示全部可用信息;/scope 可以只取用户或只取计算机的部分。要输出成 HTML 报告就 /h <文件名>(/x 是 XML)。
shutdown 的参数里,几个容易记混的:/s 关机、/r 重启、/g 关机后重启并在重启后重新登录所有注册用户、/sg 关机并在下次启动时重新登录、/a 取消已经排队但还没执行的重启(必须和 /t 一起用过、且要在倒计时结束前敲)、/p 立即关机不外带超时、/h 休眠、/hybrid 关机并为快速启动做准备、/f 强制关闭正在运行的程序(不提醒保存)、/m \<computername> 指定远程目标、/t <xxx> 设置倒计时秒数、/c "<comment>" 写明重启原因、/o 重启进入高级启动选项菜单。
msiexec 的显示选项决定了安装过程弹不弹界面:/quiet 完全无交互、/passive 只显示进度条、/qn 无 UI、/qb 基础 UI、/qr 精简 UI,末尾带 + 的(/qn+、/qb+)表示结束时会多一个对话框。批量静默安装一般是 msiexec /i "C:\example.msi" /qn。
rundll32 有个容易误解的点,官方 Remarks 明确写了:Rundll32 只能调用专门按 Rundll32 规范编写的 DLL 里的函数,它不是「随便哪个 DLL 都能拿来跑」的通用加载器。
verifier 是驱动验证工具,常用的是 verifier /query 看当前验证了哪些驱动、verifier /querysettings 看设置、verifier /reset 关掉全部验证设置。它的 bootmode 有三种持久化方式:persistent(默认,跨多次重启一直生效)、disableafterfail(Windows 启动失败后自动关闭验证)、oneboot(只对下一次启动生效)。开着驱动验证会让系统明显变慢,而且在 D 状态排查现场之外不要长期开着——按官方给的这三种模式选择你自己的持续时间。
八、一条命令把现场信息抓下来
排查问题时最省事的是先跑一次「现场快照」。下面两个脚本都是只读的:只调用 systeminfo、tasklist、sc query、schtasks /query 这类查看命令,不修改任何设置,结果在桌面上生成一份 txt。
PowerShell 版(存成 win-cmd-check-2.ps1):
# Windows 命令详解(二)自检脚本:只读采集,不做任何修改
$log = Join-Path ([Environment]::GetFolderPath('Desktop')) 'win-cmd-check-2.txt'
Set-Content -Path $log -Value 'Windows 现场快照(二):系统信息、进程与服务'
Add-Content -Path $log -Value ('生成时间:' + (Get-Date).ToString('yyyy-MM-dd HH:mm:ss'))
function Run([string]$title, [string]$cmd) {
Add-Content -Path $log -Value ''
Add-Content -Path $log -Value ('===== ' + $title + ' =====')
cmd /c $cmd 2>&1 | Add-Content -Path $log
}
Run '系统版本' 'ver'
Run '计算机名' 'hostname'
Run '当前用户与特权' 'whoami /groups'
Run '系统概要' 'systeminfo'
Run '进程清单' 'tasklist /fo csv'
Run '服务清单(前 40 行)' 'sc query type= service state= all'
Run '计划任务(前 40 行)' 'schtasks /query /fo LIST'
Run '驱动清单' 'driverquery /fo csv /nh'
Write-Host ('报告已写入:' + $log)批处理版(存成 win-cmd-check-2.bat):
@echo off
chcp 65001 >nul
setlocal
set "LOG=%USERPROFILE%\Desktop\win-cmd-check-2.txt"
(
echo Windows 现场快照(二):系统信息、进程与服务
echo 生成时间:%DATE% %TIME%
echo.
echo ===== 系统版本 =====
ver
echo.
echo ===== 计算机名 =====
hostname
echo.
echo ===== 当前用户 =====
whoami /groups
echo.
echo ===== 系统概要 =====
systeminfo
echo.
echo ===== 进程清单 =====
tasklist /fo csv
echo.
echo ===== 服务清单 =====
sc query type= service state= all
echo.
echo ===== 计划任务 =====
schtasks /query /fo LIST
) > "%LOG%" 2>&1
echo 报告已写入:%LOG%
pause几点使用说明:systeminfo 在机械硬盘的老机器上要跑十几秒到几十秒,属正常;whoami /groups 和 sc query ... state= all 需要管理员权限的命令行才能看全,普通窗口跑出来会少一部分;把这份 txt 发出去求助之前先自己扫一眼,里面有计算机名、用户名、已安装更新列表这类信息。
九、这个系列的其它几篇
- Windows 命令详解(一):文件与目录操作常用命令速查表
- Windows 命令详解(三):网络诊断与配置命令速查表
- Windows 命令详解(四):磁盘与系统维护命令速查表
- Windows 命令详解(五):批处理与 PowerShell 常用写法速查表
十、出处
下列页面均属于微软官方 Windows Commands 参考(https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/):
systeminfo、hostname、whoami、ver、wmic、driverquery、tasklist、taskkill、tskill、query-process、sc-query、sc-config、sc-create、sc-delete、query-user、query-session、quser、qwinsta、logoff、schtasks 与它的子页 schtasks-create、schtasks-query、schtasks-change、schtasks-delete、schtasks-run、schtasks-end,以及 at、reg-query、reg-add、reg-delete、reg-export、reg-import、reg-copy、reg-compare、gpresult、gpupdate、shutdown、msiexec、rundll32、verifier。
几条重点页面的完整地址:
tasklist(含过滤器字段表):https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/tasklistsc query:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/sc-queryschtasks create(含/sc取值表):https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/schtasks-createwmic(含弃用说明):https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/wmicshutdown:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/shutdown