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

# 用户与组管理

查看所有用户

1758448803131

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

1758448837858

查看详细的当前用户信息

1758451468666

1758451496211

管理员是 500,普通用户 1000 开始

使用 powershell

操作用户

1758451049110

操作组成员

1758449374002

# 服务与进程

# 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 文件

1758452098296

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 是交互式的,但是后跟命令时并不会,接下来为方便起见都为交互式:

1758902799185

#这里是服务程序管理,要区别于下面的进程管理
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

1758905163224

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

1758905291051

# 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 命令使用详解 - 星火撩原 - 博客园

# 注册表

首先理解下什么是注册表,看下百度:

1758906381028

# 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 是一个交互式命令,也存在子上下文。直接输入完整命令时不会进入,可用于批处理。

1759565042168

实例:

netsh interface ipv4 set address name="Wireless Network Connection" dhcp
#设置使用 DHCP

name 可以使用接口索引:

1759565607616

使用 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 都会显示

1759586338314

# 事件日志

# eventvwr

实际上就是

1759587931172

直接输入是打开这个程序窗口,它不是个命名行工具,下面那个才是

# 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字段
$_表示当前管道中的对象

对于对象的处理,有:

1759598900824

1759601679328

可以使用脚本块:

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

# 案例

1759599764109

筛选最耗费 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,是一种响应触发机制),方法

1759597435763

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

1759598247355

1759598543005

# 资源驱动器抽象

PowerShell 提供了一种统一的资源访问方式:Provider 模型,它把各种资源映射为虚拟驱动器(PSDrive),使用 Provider (如 FileSystem,Registry) 对接底层文件,这使得你可以使用相同的命令操作本质上完全不同的东西而无需考虑其不同

C:  驱动器
Env: 环境变量
Cert: 证书库
HKLM/HKCU: 注册表 使用时类似 HKLM:\Software\Microsoft
Alias: Powershell中的别名
Fuction: 当前会话中的函数
Variable: 当前定义的变量

将环境变量像是驱动器一样访问:

1759596134187

以及使用:

1759596305442

! 注意在 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

# 执行策略

防止恶意脚本执行

1759597140414

PS: 对应有 Get-ExecutionPolicy

详细看: PowerShell 教程 | 菜鸟教程