bb赖赖time (可以忽略这部分,完全是本人自作多情罢了):
好久不见各位安全道友们,消失了半年时间了,这半年里其实大部分时间都在摆烂
去毕业旅行、躺平、打游戏等等,弥补一下大学时光没有好好玩好好对自己
但是在这期间我也没有懈怠,虽说不如从前勤奋,但是也有在迭代和积累自己的技术
由于本人现在所在的部门工作需要更多技术,这些需求出现的同时也开拓了我的视野,也知道了自己目前的status就是一个井底之蛙,样样通样样松...
所以我打算写几个合集:"Windows 洞天艺术","SOC-安全运营中心","酒精靶场" 等等后续可能还会有更多。
当然我之前写的Golang开发依旧会持续不定期更新,因为这个合集让很多人认识了我,我想大家应该还是比较喜欢Golang工具开发这个合集的,半年过去了不知大家是否已经进阶下一个层次了,不知道下次我出Golang工具开发还入得了各位道友的眼否。
说的太多反而不讨喜,那就接下去我的第一个合集"Windows 洞天艺术"的第一篇文章,对Powershell的学习。
目录
- [Powershell 入门](#Powershell 入门)
- [在 PowerShell 中标识和修改执行策略](#在 PowerShell 中标识和修改执行策略)
- [PowerShell cmdlet 的结构](#PowerShell cmdlet 的结构)
- [Cmdlet verbs(谓词)](#Cmdlet verbs(谓词))
- [Cmdlet nouns(名词)](#Cmdlet nouns(名词))
- [使用 PowerShell cmdlet 的参数](#使用 PowerShell cmdlet 的参数)
- Tab补全功能
- [PowerShell 中显示"关于文件"内容](#PowerShell 中显示“关于文件”内容)
- [PowerShell 中定义模块](#PowerShell 中定义模块)
- [PowerShell 中查找 cmdlet](#PowerShell 中查找 cmdlet)
- 根据模块来查找对应的cmdlet
- [Get-Help/Get-Command 查找 cmdlet](#Get-Help/Get-Command 查找 cmdlet)
- [在 Internet 上查找 cmdlet](#在 Internet 上查找 cmdlet)
- [PowerShell 库](#PowerShell 库)
- [在 PowerShell 中使用命令别名](#在 PowerShell 中使用命令别名)
- [PowerShell 中使用 Show-Command 和 Get-Help](#PowerShell 中使用 Show-Command 和 Get-Help)
- [使用 Get-Help](#使用 Get-Help)
- [Get-Help 参数](#Get-Help 参数)
- 参数指定多个值
- 更新本地帮助内容
- [使用 Update-Help 更新帮助文件](#使用 Update-Help 更新帮助文件)
- [使用 Save-Help 保存本地帮助文件](#使用 Save-Help 保存本地帮助文件)
- 使用保存的文件离线更新帮助信息
Powershell 入门
在 PowerShell 中标识和修改执行策略
PowerShell 中的执行策略旨在最大程度地减少用户无意中运行 PowerShell 脚本的可能性。 你可以将其视为一项安全功能,用于控制 PowerShell 加载配置文件和运行脚本的条件。 此功能有助于防止恶意脚本的执行。
若要标识当前 PowerShell 会话的有效执行策略,请使用以下 cmdlet:
powershell
Get-ExecutionPolicy
可以配置以下策略设置:
AllSigned
。 限制所有已签名脚本的脚本执行。 此设置要求所有脚本都由受信任的发布者签名,包括在本地计算机上编写的脚本。 它会在运行来自尚未分类为受信任或不受信任的发布者的脚本之前提示你。 但是,验证脚本的签名并不能消除该脚本是恶意脚本的可能性。 它只是提供额外的检查,以最大限度地减少这种可能性。Default
。 设置默认执行策略,对于 Windows 客户端,为"Restricted",对于 Windows Server 则为"RemoteSigned"。RemoteSigned
。 这是 Windows Server 计算机的默认执行策略。 脚本可以运行,但该策略要求受信任的发布者对从 Internet 下载的脚本和配置文件进行数字签名。 此设置不需要对在本地计算机上编写的脚本进行数字签名。Restricted
。 这是 Windows 客户端计算机的默认执行策略。 它允许运行单个命令,但不允许运行脚本。Unrestricted
。 这是非 Windows 计算机的默认执行策略,你无法更改该策略。 它允许运行未签名的脚本。 此策略在运行并非来自本地 Intranet 区域的脚本和配置文件之前向用户发出警告。Undefined
。 指示当前范围中未设置执行策略。 如果所有范围中的执行策略都是"Undefined",则对于 Windows 客户端,有效执行策略为"Restricted",对于 Windows Server 为"RemoteSigned"。
若要更改 PowerShell 中的执行策略,请使用以下命令:
powershell
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
PowerShell cmdlet 的结构
PowerShell cmdlet 使用的常见格式是"谓词-名词"表示法,即:Verb-Noun。
Cmdlet verbs(谓词)
cmdlet 名称的谓词部分指示该 cmdlet 执行的操作。 cmdlet 创建者使用一组经过批准的谓词,这为 cmdlet 名称提供了一致性。 常见谓词包括:
- Get: 检索资源,例如文件或用户。
- Set:更改与资源相关的数据,例如文件或用户属性。
- New: 创建资源,例如文件或用户。
- Add:将资源添加到多个资源的容器。
- Remove:将资源从多个资源的容器中删除。
可以运行 Get-Verb
该命令,获取已批准谓词的完整列表。
Cmdlet nouns(名词)
cmdlet 名称的名词部分指示该 cmdlet 影响的资源或对象的类型。 对同一资源运行的所有 cmdlet 应使用相同的名词。 例如,名词 Service 用于处理 Windows 服务的 cmdlet,而名词 Process 用于管理计算机上的进程。
名词中还可以包含前缀,可帮助将相关名词按系列分组。 例如,Active Directory 名词以字母 AD 开头(例如 ADUser、ADGroup 和 ADComputer)。
Microsoft SharePoint Server cmdlet 以前缀 SP 开头,Microsoft Azure cmdlet 以前缀 Az 开头。
Windows PowerShell 使用通用术语命令来指代 cmdlet、函数、工作流、应用程序和其他项。 这些项的创建方法各不相同。 但就目前而言,应将其工作方式视作相同。 本模块交替使用"命令"和"cmdlet"这两个术语。
使用 PowerShell cmdlet 的参数
参数格式
参数名称以短划线 (-) 开头。 空格用于分隔要从参数名称传递的值。 如果传递的值包含空格,需要用引号将文本引起来。 某些参数接受多个值,这些值必须用逗号分隔(不含空格)。
可选参数与必需参数
参数可以为可选参数或必需参数。 如果是必需参数,而运行 cmdlet 时没有提供该参数的值,Windows PowerShell 会提示你为其提供值。 例如,如果运行 Get-Item 命令,会收到来自 Windows PowerShell 的以下消息,其中包括为 -Path 参数提供值的提示:
PS C:\> Get-Item
cmdlet Get-Item at command pipeline position 1
Supply values for the following parameters:
Path[0]:
如果在提示符处输入文本 C:\,然后按 Enter 键两次,该命令将成功运行。 由于此参数可以接受多个值,因此必须按 Enter 键两次。 Windows PowerShell 会继续提示输入新值,直到按 Enter 键为止(实际上不用提供值)。
在某些情况下,可选择不输入参数名称,只需输入参数的值即可。 运行命令 Get-ChildItem C:\ 与运行命令 Get-ChildItem -Path C:\ 相同,因为参数 -Path 在 cmdlet 定义中定义为第一个参数。 这称为位置参数。 在本课程中,你会注意到这些内容。 省略参数名称仅在定义了参数位置时才适用。 并非所有命令都包含位置参数。
递归匹配当前目录的后缀名,是否 match .js .html .css
powershell
$((Get-ChildItem -Recurse $Path).Extension | Sort-Object -Unique) -match '\.js|\.html|\.css'
Switches
Switches是一种特殊情况。 从根本上来说,它们是接受布尔值(true 或 false)的参数。 它们与实际布尔参数的不同之处在于,仅当运行命令时包含了开关,该值才能设置为 true。 一个示例是 Get-ChildItem cmdlet 的 -Recurse 参数或开关。 Get-ChildItem c:\ -Recurse 命令不仅会返回 C:\ 目录中的项,还会返回其所有子目录中的项。 如果没有 -Recurse 开关,将仅返回 C:\ 目录中的项。
这种的意思就是叫开关Switches,有就开,没有这个参数就关
powershell
Get-ChildItem c:\tmp -Recurse
# 这个命令会递归读取你所有文件,然后返回,使用的时候慎重,不然会一下子展示很多文件
Tab补全功能
输入几个字符的 cmdlet 或参数,然后按 Tab 键,PowerShell 将根据输入字符的匹配情况自动提供缺失的名称部分。 如果有多个匹配项,只需多次按 Tab 键,直到出现要使用的匹配项。 这适用于 cmdlet 和参数、变量名、对象属性和文件路径。
Tab 自动补全还帮助发现 cmdlet 和参数名称。 例如,如果你知道需要适用于 Active Directory 资源的 Get cmdlet,则可以在控制台中输入文本 Get-AD,然后按 Tab 键查看可用选项。 对于参数,只需输入短划线 (-),然后可以多次按 Tab 键查看 cmdlet 的所有参数。
- 支持通配符的补全
Tab 自动补全甚至可以使用通配符。 如果知道需要一个对服务进行操作的 cmdlet,但不确定需要哪个,则在控制台中输入文本*-service
,然后按 Tab 键查看名称中包含文本 -service 的所有 cmdlet。
PowerShell 中显示"关于文件"内容
虽然 Windows PowerShell 中的很多帮助内容与命令有关,但也有很多帮助文件描述了 PowerShell 概念。 这些文件包括有关 PowerShell 脚本语言、运算符和其他详细信息的信息。 此信息并不具体涉及单个命令,而是涉及全局 shell 技术和功能。
拿到某个cmdlet的详细信息:
powershell
Get-Help Get-Process

通配符获取cmdlet列表(当你使用通配符进行匹配的时候不是显示详细信息):
powershell
Get-Help Get-*

PowerShell 中定义模块
可以通过运行以下命令来检查可用模块的列表:
powershell
Get-Module -ListAvailable
自动加载
有固定存放模块的目录,所以我们只要将自己写好的模块存进去即可
在 Windows PowerShell 版本 3.0 及更新版本中,如果运行属于该模块的 cmdlet,模块会自动加载。 如果包含 cmdlet 的模块位于模块加载路径下的文件夹中,则这一点有效。 默认情况下,这些文件夹包括 %systemdir%\WindowsPowerShell\v1.0\Modules
和 %userprofiles%\Documents\WindowsPowerShell\Modules
。 文件夹列表存储在环境变量中 $env:PSModulePath
。 按名称显式导入模块时,PowerShell 会检查该环境变量引用的位置。
对于 PowerShell 7,PSModulePath 包含以下位置:
-
C:\Users\<user>\Documents\PowerShell\Modules
-
C:\Program Files\PowerShell\Modules
-
C:\Program Files\PowerShell\7\Modules
-
C:\Program Files\WindowsPowerShell\Modules
-
C:\WINDOWS\System32\WindowsPowerShell\v1.0\Modules
使用 Windows PowerShell 时,通常使用 环境变量(指向 %systemdir%\WindowsPowerShell\v1.0)和模块路径(即使用
$PSHome
表示法)的组合来引用 %systemdir%\WindowsPowerShell\v1.0\Modules 路径$PSHome\Modules
。 对于 PowerShell 7.0,$PSHome
环境变量引用 C:\Program Files\PowerShell\7。
PowerShell 中查找 cmdlet
根据模块来查找对应的cmdlet
使用 Get-Module 命令时,会显示所引用模块包含的部分 cmdlet 列表。 但是,可以通过其他方式使用该模块来查找其 cmdlet。
例如,如果已发现模块 NetAdapter,会预计它应包含可用于管理网络适配器的 cmdlet。 可以通过运行 Get-Command --Module NetAdapter 命令在该模块中找到所有适用的命令。 --Module 参数将结果限制为仅指定模块中的那些命令。
powershell
# 比如你之前学的 Get-Module -ListAvailable 检查完可用模块后发现NetAdapter
# 然后你想知道NetAdapter有啥函数命令可以用就如下命令可以看
Get-Command -Module NetAdapter

Get-Help/Get-Command 查找 cmdlet
可以使用 Get-Help 执行类似的搜索,包括使用通配符。
使用 Get-Help 而不是 Get-Command 的一个优点是当 Get-Help 找不到匹配的命令名称时候它会使用查询字符串执行全文搜索。
如果运行 Get-Command beep 命令,则没有可用结果。 如果运行 Get-Help beep 命令,将返回多个结果。
powershell
Get-Help Get-event*
↓↓相当于↓↓ # 不同点就是Get-Help 找不到匹配的命令名称,它会使用查询字符串执行全文搜索
Get-Command --Verb Get --Noun event*

你还可以多加一个参数-Full
来针对该cmdlet查看更加详细的帮助信息(这参数后面会讲到)
还可以直接弹出窗口的方式去查看一个命令
powershell
Get-Help Stop-Process -ShowWindow

在 Internet 上查找 cmdlet
不限于搜索计算机已安装的 cmdlet。 可以搜索 Internet 来查找各种 Microsoft 和非 Microsoft 模块和 cmdlet。 如果你只是使用术语 PowerShell 和正在使用的技术进行搜索,你会发现许多指向 Microsoft 和非 Microsoft 网站上的文章的链接。 几乎所有 Microsoft 团队都创建了用于管理其产品的 cmdlet,你可以将其作为管理工具的一部分进行安装。
PowerShell 库
PowerShell 库是 Windows PowerShell 相关内容(包括脚本和模块)的中央存储库。
PowerShellGet 包含用于从联机库中查找和安装模块、脚本和命令的 cmdlet。
例如,Find-Command cmdlet 搜索命令、函数和别名。 其工作原理类似于 Get-Command cmdlet,包括对通配符的支持。
有关 PowerShell 库的详细信息,请参阅 https://www.powershellgallery.com/
在 PowerShell 中使用命令别名
PowerShell 包含旧批处理和 Linux 命令的别名
windows powershell还是可以继续使用cmd那一套命令,比如dir之类的
dir 命令运行 Get-ChildItem,cd 命令运行 Set-Location,mkdir 命令运行 New-Item。 这些命令在 PowerShell 中运行,因为它们是执行等效操作的 cmdlet 的别名。
别名和参数
请务必注意,别名通常不支持原始命令使用的参数。 例如,如果在控制台中运行命令 dir /o:d,则将收到错误,因为 Get‑ChildItem 无法识别 /o:d 参数。 相反,可以使用 dir | sort LastAccessTime 按上次访问的日期和时间以升序列出当前文件夹的内容。
也就是说你要在powershell中执行以前的比如dir,那你执行dir其实就相当于执行Get-ChildItem,所以cmd中你的dir的参数在powershell中无效,因为你这个参数其实是给了Get-ChildItem
Get-Alias
- 通过cmdlet查找别名都有哪些
(可能你会发现很多个别名,当然这些都是可以用的)
powershell
Get‑Alias -Definition Get-Process
- 通过别名查找cmdlet
powershell
Get-Alias gps
参数也可以具有别名。 例如,-s 参数是 Get-ChildItem cmdlet 中 -Recurse 的别名。 实际上,对于参数,如果命令中包含的名称部分足以唯一标识该参数,则可以像使用别名一样使用部分参数名称。
New-Alias
使用 New-Alias cmdlet 创建自定义别名,并将其映射到任何现有 cmdlet。
- 自定义别名不会在 Windows PowerShell 会话之间保存。
每次打开 Windows PowerShell 时,都可以使用 Windows PowerShell 配置文件重新创建别名。
比如:
为 Get-Help
创建 gh
别名
powershell
New-Alias -Name gh -Value Get-Help
使用的时候就可以:
powershell
gh Get-CimInstance -Detailed
PowerShell 中使用 Show-Command 和 Get-Help
Show-Command cmdlet 将打开一个窗口,其中显示命令列表或特定命令的参数。 此窗口与在 ISE 中选择"显示命令窗口"选项时显示的窗口相同。
在"显示命令窗口"中,为指定的命令设置的每个参数都会显示在单独的选项卡上。这清楚地表明,不能在集之间混合和匹配参数。
为所有必需参数提供值后,可以通过在"显示"命令窗口中选择"运行"来立即运行该命令。 也可以通过选择"复制"将其复制到剪贴板。可通过剪贴板将命令粘贴到控制台中,以便可在不运行命令的情况下查看正确的命令行语法。
使用 Get-Help
- Get-help (cmdlet)
通过制定某个cmdlet来显示详细信息 - help (cmdlet)
一页 一页的显示 - man (cmdlet)
和help一样
Get-Help 参数
- --Examples
展示某个cmdlet的使用示例
powershell
Get-Help Get-Process -Examples
- -Full
提供有关 cmdlet 的详细信息,包括:- 每个参数的说明。
- 每个参数是否具有默认值(不过此信息并非一致地记录在所有命令中)。
- 参数是否是必需的。
- 参数是否可接受特定位置的值(在这种情况下会给出从 1 开始的位置编号),或者是否必须输入参数名称(在这种情况下会显示命名参数)。
- 参数是否接受管道输入;若接受,则还显示接受方式。
powershell
Get-Help Get-Process -Full
- Get-Help 参数包括:
- ‑ShowWindow。 在单独的窗口中显示帮助主题,以便在输入命令时更容易访问帮助。
- ‑Online。 在浏览器窗口中显示帮助主题的联机版本(通常是最新的信息)。
‑Parameter ParameterName。 显示命名参数的说明。
- ‑Category。 仅显示特定类别命令的帮助,如 cmdlet 和函数。
参数指定多个值
某些参数接受多个值。 在语法部分,参数值类型中的双方括号表示法指定这些参数。 例如:
powershell
-ComputerName <string[]>
上述语法指示 --ComputerName 参数可以接受一个或多个字符串值。
指定多个值的一种方法是使用逗号分隔的列表。
无需用引号将值括起来,除非值本身包含逗号或空格,例如空格字符或制表符。
例如,使用以下命令指定多个计算机名:
powershell
Get-EventLog --LogName Application --ComputerName LON-CL1,LON-DC1
更新本地帮助内容
运行 Update-Help 扫描计算机以查找所有已安装的模块,检索每个模块的联机帮助位置,并尝试下载其各自的帮助文件。
必须以本地管理员组成员的身份运行此命令,因为 Windows PowerShell 核心命令帮助存储在 %systemdir% 文件夹中。
如果无法下载帮助,将显示错误消息。 在这种情况下,Windows PowerShell 仍会为命令创建默认帮助显示。
默认情况下,即使连续多次运行命令,Update-Help 也会每 24 小时检查一次帮助文件。 若要重写此行为,请包括 --Force 参数。
与 Update-Help 配套的是 Save-Help。 它会下载帮助内容并将其保存到指定的位置。 利用此功能可将该内容复制到未连接到 Internet 的计算机。 Update-Help 提供了一个参数来指定替代源位置。 通过此功能,可在未连接到 Internet 的计算机上更新帮助。
使用 Update-Help
和 Save-Help
前,需注意以下几点:
- 管理员权限 :通常需要以管理员身份运行 PowerShell 才能执行帮助更新操作。
- 执行策略 :确保 PowerShell 的执行策略允许运行脚本。你可以通过
Get-ExecutionPolicy
查看当前策略,若需更改,可使用Set-ExecutionPolicy RemoteSigned
(需要管理员权限)。 - 网络连接 :
Update-Help
需要互联网连接来从微软服务器下载帮助文件。若网络受限,需使用Save-Help
离线方式。 - 语言支持 :默认情况下,
Update-Help
会尝试下载与操作系统 UI 语言文化相匹配的帮助文件。若需特定语言的帮助,可使用-UICulture
参数指定。
使用 Update-Help 更新帮助文件
Update-Help
命令的主要作用是下载并安装最新的帮助文件到你的本地计算机。
常用参数
-Module <ModuleName[]>
:指定要更新帮助的模块名称(如NetAdapter
,Hyper-V
)。支持通配符*
。-UICulture <CultureInfo[]>
:指定要下载的帮助文件的语言文化(如en-US
,zh-CN
)。若不指定,则使用 PowerShell 的当前 UI 文化。-Force
:强制更新帮助文件,即使未到预设的更新间隔或帮助文件已存在。-ErrorAction <Action>
:指定发生错误时执行的操作。对于Update-Help
,常见的错误如模块帮助文件不存在 (404 错误)或模块名称大小写问题 ,可使用-ErrorAction SilentlyContinue
忽略特定错误。
案例1:更新所有模块的帮助信息
执行后,PowerShell 会连接微软服务器并下载所有已安装模块的最新帮助文档。
powershell
# 以管理员身份运行PowerShell
Update-Help -Force
案例2:更新指定模块的帮助信息 (如 NetSecurity
模块)
powershell
Update-Help -Module NetSecurity -Force
案例3:忽略更新过程中的某些错误(例如某些模块没有相应语言的帮助文件时):
powershell
Update-Help -Force -ErrorAction SilentlyContinue
使用 Save-Help 保存本地帮助文件
Save-Help
命令的主要作用是将帮助文件下载到一个指定的本地目录或网络共享路径,但不立即安装 。这对于需要在无法访问互联网的计算机(如内网服务器) 上更新帮助文件非常有用。
常用参数
-DestinationPath <String[]>
:指定保存帮助文件的目标目录路径。-Module <ModuleName[]>
:指定要下载帮助的模块名称。-UICulture <CultureInfo[]>
:指定要下载的帮助文件的语言文化。-Force
:强制下载帮助文件,即使未到预设的下载间隔。
案例1:将帮助文件下载到本地目录 (如 D:\PSHelp
)
此命令会将所有模块的帮助文件下载到 D:\PSHelp
目录
powershell
# 以管理员身份运行PowerShell
Save-Help -DestinationPath D:\PSHelp -Force
案例2:为指定模块下载帮助文件 (如 BitLocker
模块)
powershell
Save-Help -DestinationPath D:\PSHelp -Module BitLocker -Force
使用保存的文件离线更新帮助信息
- 将包含帮助文件的目录 (如上述的
D:\PSHelp
)复制到离线计算机上,或确保离线计算机能访问到存放帮助文件的网络共享位置。 - 在离线计算机上,使用
Update-Help
并指定-SourcePath
参数 :
此命令会从D:\PSHelp
目录中获取帮助文件并安装到离线计算机上
powershell
# 以管理员身份在离线计算机上运行PowerShell
Update-Help -SourcePath D:\PSHelp -Force