由于我高中时是个神经上台打开 cmd(有的时候是图吧工具箱)的神经懂哥(到现在有的时候还会犯毛病),所以多少了解了一点,这里只写不知道的部分
# 用户与组管理
查看所有用户

查看当前用户的 SID!!!<del>(SUID)</del>!!!

查看详细的当前用户信息


管理员是 500,普通用户 1000 开始
使用 powershell
操作用户

操作组成员

# 服务与进程
# sc
sc [操作] [服务名] [参数] | |
sc query "nginx" | |
sc queryx "nginx" #更为详细 | |
sc start/stop "nginx" | |
sc config "ngnix" start= auto/demand/disable | |
#自动 / 手动 / 禁止启动 | |
sc create "myserive" binPath="path_to_exe" start= auto | |
sc delete "myserive" |
# tasklist
tasklist /fi "PID eq 1234" | |
tasklist /fi "STATUE eq running" | |
tasklist /fi "IMAGENAME eq notepad.exe" | |
tasklist /svc #显示对应服务 | |
tasklist /m kernal32.dll | |
#加载了该 dll 的进程,没有参数则是输出显示进程加载的 dll 文件 |

tasklist /s 192.162.1.100 -u admin /p password | |
#用于远程查看 |
# wmic
# 省流
wmic [类别] [操作] | |
wmic process | |
get name,processid | |
where "pid=1234" get commandline | |
where name="notepad.exe" delete | |
where caption="windows time" call startservice | |
wmic bios list | |
Brief | |
(Full) | |
Instance 对象实例 | |
Statue 对象状态 | |
System | |
Writeable 可写入属性信息 |
直接执行的 wmic 是交互式的,但是后跟命令时并不会,接下来为方便起见都为交互式:

#这里是服务程序管理,要区别于下面的进程管理 | |
Service where caption="windows time" call stopservice | |
Service where caption="windows time" call startservice | |
SERVICE where name="Spooler" call PauseService | |
SERVICE where name="Spooler" set StartMode="auto" | |
#启动类型有三种,auto,disable,manual |
caption 是显示服务名,name 是服务名称,两者可能不相同。比如上面的 windows time 的服务名称时 w32time。
再如 telnet 的显示服务名就是 telnet,但是服务名称是
tlntsvr通常 name 就是对应可执行文件的名称
process where name="QQ.exe" call terminate #关闭 QQ 或者: process where name="QQ.exe" delete process call create notepad #新建进程 process where "name='explorer.exe' and executablepath<>'%SystemDrive%\\windows\\explorer.exe'" delete#终止所有不在系统目录下执行的 explorer.exe 进程,终止可疑的同名进程,其中 & lt;> 表示不等于,类似的有 =,like process get name,executablepath可以用于管理远程计算机:
/node:"xxx.xxx.xxx.xxx" /password:"xxx" /user:"xxx"
# 系统管理
COMPUTERSYSTEM get SystemStartupOptions #获取系统启动项 | |
COMPUTERSYSTEM get domain #获取工作组 / 域 | |
computersystem where "name='abc'" call rename 123 #重命名计算机 | |
computersystem where "name='google'" call joindomainorworkgroup "","","MyGroup",1 | |
#将 google 用户加到 MyGroup 中,1 表示加入,前两个空值分别是域或工作组的用户名,对应的密码 |
# 文件管理
这里出现的操作包括:
list,call delete,call copy,get name
示例:
datafile where "drive='e:' and path='\\test\\' and FileName='cc' and Extension='cmd' and FileSize>'1000'" list | |
#查找该目录下大于 1KB 的 cc.cmd 文件,不包括子目录,除非不给 path | |
datafile where "drive='e:' and path='\\test\\' and FileName='cc' and Extension='cmd'" call copy "e:\aa.bat" | |
#自己看 | |
datafile where "drive='h:' and extension='txt' and path like '%\\test\\%' and filename like '%perl%'" get name | |
#查找 h 盘下文件名含有 perl,目录有 test,后缀为 txt 的文件 |
# 环境变量设置
#获取 temp 环境变量 | |
ENVIRONMENT where "name='temp'" get UserName,VariableValue | |
#更改 path 环境变量值,新增 e:\tools | |
ENVIRONMENT where "name='path' and username='<system>'" set | |
VariableValue="%path%;e:\tools" | |
#新增系统环境变量 home, 值为 % HOMEDRIVE%% HOMEPATH% | |
ENVIRONMENT create name="home",username="<system>",VariableValue="%HOMEDRIVE%%HOMEPATH%" | |
#删除 home 环境变量 | |
ENVIRONMENT where "name='home'" delete |
# 账户设置
USERACCOUNT where name="Administrator" set FullName="admin" | |
USERACCOUNT where "name='admin" call Rename admin00 |

useraccount create newuser P@ssw0rd | |
useraccount where name="newuser" set password="NewP@ss123" | |
useraccount where name="newuser" set disabled=true | |
useraccount where name="newuser" delete | |
useraccount where name="administrator" get /format:list |

# PS
wmic 中并没有正常情况下的命令,需要运行对应的 exe
process call create shutdown.exe
可以搭配批处理使用:
for /f "skip=1 tokens=1*" %i in ('wmic datafile where "FileName='qq' and extension='exe'" get drive^,path') do (set "qPath=%i%j"&@echo %qPath:~0,-3%) | |
#drive^,path 中的 ^ 用于转义,只在批处理中这样 | |
#获取屏幕分辨率 wmic DESKTOPMONITOR where Status='ok' get ScreenHeight,ScreenWidth | |
wmic PageFileSet set InitialSize="512",MaximumSize="512" | |
#设置虚拟内存到 E 盘,并删除 C 盘下的页面文件,重启计算机后生效 | |
wmic PageFileSet create name="E:\\pagefile.sys",InitialSize="1024",MaximumSize="1024" | |
wmic PageFileSet where "name='C:\\pagefile.sys'" delete |
其他的细枝末节参见原文: WMIC 命令使用详解 - 星火撩原 - 博客园
# 注册表
首先理解下什么是注册表,看下百度:

# reg
常见子命令:
reg query | |
reg add | |
reg delete | |
reg modify | |
reg export #导出,保存为.reg 文件,用于备份 | |
reg import | |
reg load #加载 hive 文件,这是离线的注册表配置单元(比如其他用户的注册表) | |
reg unload0 |
示例:
# 查询 HKEY_CURRENT_USER 下的桌面图标配置键,HKCU 是其缩写 | |
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel" | |
# 在 TestKey 下添加字符串值:Name= "MyTest"(/v 指定值名,/t 指定类型,/d 指定数据,/f 强制覆盖),HKLM 是 HKEY_LOCAL_MACHINE,系统级根键 | |
reg add "HKLM\SOFTWARE\TestKey" /v "Name" /t REG_SZ /d "MyTest" /f | |
#REG_SZ 是字符串,REG_DWORD 是 32 位数值,REG_BINARY 是二进制。delete 于 add 类似 |
类型不止上面常见的三个:
字符串值(REG_SZ)
二进制值(REG_BINARY)
32 位值(4 个字节)(REG_DWORD)
64 位值(5 个字节)(REG_QWORD)
多字符串值(REG_MULTI_SZ)
可扩充字符串值(REG_EXPAND_SZ)
可能会用到的:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run | |
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run | |
#自启动路径,HKLM 主键修改要管理员,其中的键值数据是程序的绝对路径 |
# regedit 高级用法
占位保留
# 网络配置
# netsh
netsh interface ip show config 本地连接 | |
IP相关 | |
netsh interface ip set address name=\"本地连接\" source=static address=xxxx mask=xxxxxxx geteway=xxxx | |
#IP 地址,子网掩码,网关 | |
DNS相关 | |
netsh interface ipv4 set dns \"以太网\" static 8.8.8.8 primary validate=no | |
netsh interface ipv4 add dns \"以太网\" 8.8.4.4 index=2 | |
路由相关 | |
netsh interface ipv4 add route 192.168.0.0/24 \"本地连接\" 192.168.0.254 | |
#CIDR, 网关。这是在配置路由规则,在访问特定的网段时使用特定的网关 | |
#24 表示前 24 位时网络位,最后 8 位时主机位,也可以更加细化比如 / 27,只是用 5 位作为主机位,此时最多只有 32 台主机 |
直接输入 netsh 是一个交互式命令,也存在子上下文。直接输入完整命令时不会进入,可用于批处理。

实例:
netsh interface ipv4 set address name="Wireless Network Connection" dhcp | |
#设置使用 DHCP |
name 可以使用接口索引:

使用 netsh 实现 TCP 连接的端口转发:
netsh interface portproxy add v4_to_v4 listenaddress=localaddress listenport=localport connect=destaddress connectport=destport | |
#要使用计算机的当前 IP 地址,不能使用本地回环地址 | |
netstat -ano | findstr :port | |
netsh interface portproxy dump/delete v4_to_v4 .../reset #查看已有的转发规则 | |
#确保处于监听状态 |
可以让任意的远程服务看起来像是在本地运行
other:
netsh firewall set opmode disable#关闭防火墙 | |
#在 cmd 中这是一个已经弃用的命令,但是可以在 powershell 中直接使用,你可以在 cmd 中直接调用 powershell | |
#相同作用的: | |
netsh advfirewall set allprofiles state off |
类似 linuxiptable 的用法
netsh advfirewall firewall add rule name="deny udp 137" dir=in protocol=udp localport=137 action=block | |
#看连接 | |
netsh interface ip show tcpconn |
具体见
windows 自带的 netsh 的使用 - 卿先生 - 博客园
netsh 命令解析与实例使用 - 腾讯云开发者社区 - 腾讯云
# ipconfig
ipconfig /all #会加上 MAC 地址 | |
ipconfig /release #释放 IP 地址 | |
ipconfig /renew | |
ipconfig /flushdns #刷新 DNS | |
ipconfig /displaydns #显示 DNS 缓存 |
# route
route print #显示所有路由表 | |
route print 10.* | |
route /p add <目标IP> mask <子网掩码> <下一个跃点> metric 7 if 0x3 | |
#加 /p 时表示持久性路由,添加默认路由是:route add 0.0.0.0 mask 0.0.0.0 < 网关 > | |
route delete <目标IP> mask <子网掩码> | |
route delete 10.* | |
route change <目标IP> mask <子网掩码> <更改后的下一个跃点> |
非持久路由将在重启后失效,成本跃点数(metric): 当网络中有多条路由可到达同一个目标网段时,系统会根据 其选择最优路由,数值越小优先级越高,这是可选的。if 0x3 表示只对接口索引为 3 的网络设备生效
这个接口索引,在下图的 route print 以及之前的 netsh interface show interfaces 都会显示

# 事件日志
# eventvwr
实际上就是

直接输入是打开这个程序窗口,它不是个命名行工具,下面那个才是
# wevtutil
windows event utility
wevtutil /q /fo CSV /f "System" > sys_log.csv | |
#导出日志,也可以直接配合 findstr 筛选 |
wevtutil el #所有日志名称 | |
wevtutil gl System /f:xml #以 XML 格式显示有关本地计算机的系统日志文件的配置信息 | |
wevtutil sl /c:config.xml #使用配置文件设置事件日志属性 | |
wevtutil gp Microsoft-Windows-Eventlog /ge:true #显示关于该事件的发布者信和可以引发的元数据 | |
wevtutil qe Application /c:3 /rd:true /f:text #以文本格式显示应用程序的三个最新事件 | |
wevtutil gli Application #查看应用程序日志状态 | |
wevtutil epl System C:\backup\system0506.evtx #导出事件 | |
wevtutil cl Application /bu:C:\admin\backups\a10306.evtx#备份后清空应用日志 |
el event-log
gl global-log
sl system-log
gp get-policy , 查询事件日志的册罗设置,比如日志大小,保留策略,一般取决于组策略或者本地策略
qe query-events
gli get-log-info, 查询日志基础信息,不是内容而是其属性
epl
cl clear-log
/ge: get-effective, 返回受到各方面影响后最终实际生效的策略
/bu: backup
# powershell
powershell 与一般的 shell 不同,它的基本命令单元 Cmdlet 都是基于.NET 的类,每一个命令都会返回一个或者多个对象。
# 对象和对象管道
在 powershell 中使用管道符转递的不再是字符串,而是一个完整的对象或对象集合,将保留结构化数据(属性,方法),可以进行进一步处理
比如
Get-Process | Where-Object {$_.CPU -gt 100} | Select-Object Name,CPU | |
获取所有进程 | |
过滤CPU使用率大于100的进程 | |
只输出Name和CPU字段 | |
$_表示当前管道中的对象 |
对于对象的处理,有:


可以使用脚本块:
Get-Process | Select-Object Name, @{Name="MemoryMB";Expression={$_.WorkingSet / 1MB -as [int]}} | |
#注意,后面的 Name=xxx 只是给后面计算出的结果指定名称。这里的 / 1MB 实际上只是来转换单位,-as [int] 将值转换为整型 |
可以排序分组:
Get-Process | Sort-Object CPU -Descending | |
Get-Service | Group-Object Status |
可以导出成 CSV/JSON:
Get-Service | Select-Object Name, Status | Export-Csv -Path services.csv -NoTypeInformation | |
Get-Service | ConvertTo-Json |
# 案例

筛选最耗费 CPU 的 5 个进程
在高版本中 Where-Object 可以简写:
Where-Object Name -like "*Win*" | |
等同于原来的 | |
Where-Object { $_.Name -like "*Win*" } |
按服务状态统计数量(Name,Count 是 Group-Object 的对象,分别记录依据值,组内数量,此外还有一个 Group,是组内具体对象的集合)
PS:powershell 中的命令命名大多是:动词 — 名词
如果你不知道这个对象的结构,可以:
Get-Process | Get-Member |
下图中有:属性的别名,事件 (定义触发条件,如有文件创建时执行 xxx,是一种响应触发机制),方法

如果还是不能理解返回的是对象:


# 资源驱动器抽象
PowerShell 提供了一种统一的资源访问方式:Provider 模型,它把各种资源映射为虚拟驱动器(PSDrive),使用 Provider (如 FileSystem,Registry) 对接底层文件,这使得你可以使用相同的命令操作本质上完全不同的东西而无需考虑其不同
C: 驱动器 | |
Env: 环境变量 | |
Cert: 证书库 | |
HKLM/HKCU: 注册表 使用时类似 HKLM:\Software\Microsoft | |
Alias: Powershell中的别名 | |
Fuction: 当前会话中的函数 | |
Variable: 当前定义的变量 |
将环境变量像是驱动器一样访问:

以及使用:

! 注意在 linux 中这里要使用 powershell 特有的 dir,而不是 ls,ls 不能识别 env:!
也可以手动创建:
Get-PSDrive #输出所有驱动器 | |
New-PSDrive -Name "Share" -PSProvider FileSystem -Root "\\server\share" |
# 脚本与模块
脚本: .ps1 的文本文件
模块
一个 .psm1 文件:模块脚本
包含 .psd1 清单的文件夹:高级模块
模块支持自动加载(如果使用到其中的函数),版本控制,依赖声明。(怎么这么像是包)
Get-Module -ListAvailable | |
Import-Module Az |
# 执行策略
防止恶意脚本执行

PS: 对应有 Get-ExecutionPolicy
详细看: PowerShell 教程 | 菜鸟教程