[TOC]

0x01 开始使用 PowerShell

Q: 在哪里可以找到 以及打开 PowerShell?

  • 1.在 Windows 10 上查找 PowerShell 的最简单方法是在搜索栏中键入”PowerShell”此时出现有64版本和32位; (Tips:建议运行 64 位版本的 PowerShell 除非出于特殊原因才运行 32 位版本)
  • 2.在 桌面 任意地方按住 Shift+右键 此时出现在此打开PowerShell窗口点击即可打开。
  • 3.启动PowerShell非常简单可以直接在CMD命令行之中键入以下命令PowerShell 或者 PowerShell_ISE

TIPS: 默认键入一个字符串PS会将它原样输出,如果该字符串是一个命令或者启动程序,在字符串前加‘&’可以执行命令,或者启动程序。

1
2
3
4
5
6
7
8
PS C:\Users\WeiyiGeek> "ls"
ls
PS C:\Users\WeiyiGeek> &"ls"
# 目录: C:\Users\WeiyiGeek
# Mode LastWriteTime Length Name
# ---- ------------- ------ ----
# d----- 2019/7/26 8:45 .android
# d----- 2019/8/19 17:27 .config


Q: 如何以管理员启动 PowerShell?

  • 1.在点击开始然后右键单击 Windows PowerShell 快捷方式,然后选择“以管理员身份运行”,如图 1-5 所示 。

    以管理员身份运行

    以管理员身份运行

  • 2.如果以普通用户身份登录 Windows,系统将提示你输入凭据。 我将输入我的用户帐户的凭据,其身份是域用户和本地管理员如图 1-6 所示。

    用户帐户的凭据

    用户帐户的凭据

  • 3.在任务栏上的 PowerShell 快捷方式,右键打开属性并单击的“高级”,然后选中所表示的"以管理员身份运行"复选框,然后双击“确定”,以接受更改并退出这两个对话框。

    PowerShell属性

    PowerShell属性

Tips : 较新版本的 Windows PowerShell 作为 Windows Management Framework (WMF) 的一部分分发, 并且 WMF 的版决定了要使用哪个特定版本的 .NET Framework。


0x02 命名规则

描述: PowerShell 中的编译命令称为 cmdlet (发音为“command-let”(而不是 CMD-let))。mdlet 名称采用单数形式的"动词-名词、连字符"命令形式, 一般的动词与名称的首字母为大写(在编程中需要抱持良好开发的风格);
比如: PowerShell 具有Get-Process(正在运行哪些进程)、Stop-Process、Get-Service(检索服务及其状态的列表) 和 Stop-Service 一看就一目了然等命令。说白了原来您需要记忆100个命令现在只需要10个动词和 10 个名词就能搞定, PS 利用这些相似之处减少了解和使用 cmdlet 时需要知道的不同名称的数量。

Cmdlet 使用标准参数以及命令名称

  • 1.PS标准化参数分隔符,参数名称前面始终带有“-”
    • Get-Command -Name Clear-Host

  • 2.帮助参数 (?):在任何 cmdlet 上指定 -? 参数时,PowerShell 将显示该 cmdlet 的帮助。
    • Get-Service -?

  • 3.通用参数: 参数由 PowerShell 引擎控制, 通用参数的行为方式始终相同。
    • 通用参数: WhatIf、Confirm、Verbose、Debug、Warn、ErrorAction、ErrorVariable、OutVariable 和 OutBuffer

  • 4.建议的参数名称:PowerShell 核心 cmdlet 使用标准名称
    • 指示计算机的参数的建议名称是 ComputerName,而不是 Server、Host、System、Node 或其他常见的备选单词。 其他重要的建议参数名称是 Force、Exclude、Include、PassThru、Path 和 CaseSensitive。

  • 5.PS支持别名以通过备用名称引用命令(Get-Alias获取别名),别名将新名称与其他命令关联。
    • 例如 PS 具有名为 Clear-Host 的内部函数,该函数清空输出窗口。可以在命令提示符下键入cls 或 clear 别名, PS解释这些别名并运行Clear-Host 函数

  • 6.解释标准别名: PS 别名尝试兼顾清晰度和简洁性(可以进行缩写-进截取动词第一个字母和名词的前两个字母)
    • 比如: 熟悉 PowerShell 别名后就很容易猜到 sal 别名指的是 Set-Alias , 又比如gcm等同于Get-Command


PS 支持几种其他类型的命令:

  • 别名: Alias
  • 功能: Function
  • 脚本: Script
  • 命令: Cmdlet


Tips : PowerShell 命令是一个通用术语,通常用于指代 PowerShell 中任何类型的命令,不管是 cmdlet、函数还是别名。

  • 1.在 PS 6 之前 sc 是 Set-Content cmdlet 的别名, 因此若要在 ps6 之前的 PowerShell 版本中运行 sc.exe 命令,必须使用包含文件扩展名 exe的完整文件名 sc.exe。
  • 2.外部可执行文件或具有已注册的文件类型处理程序的文件也被归类为命令。

0x03 基础核心 Cmdlet 命令

描述:Windows PowerShell 引入了 cmdlet(读作command-let)的概念,它是内置于 Shell 的简单的单一函数命令行工具。 PS 中包括一百多个基本核心 cmdlet 你可以编写自己的 cmdlet 并与其他用户共享。

PowerShell 中的几个基础核心 Cmdlet (开始学习PS编程前必备):

  • Get-Host (别名Host) 、$PSVersionTable
  • Get-Command
  • Get-Help (别名Help) 、Update-Help
  • Get-Alias 、Set-Aliase
  • Get-PSProvider


Get-Host 命令 - PS 版本查看

描述: 可以采用变量或者host命令的方式进行查看。

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
# 方式1.查看PS的主此版本
PS C:\Program Files> $PSVersionTable
# Name Value
# ---- -----
# PSVersion 5.1.19041.610
# PSEdition Desktop
# PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
# BuildVersion 10.0.19041.610
# CLRVersion 4.0.30319.42000
# WSManStackVersion 3.0
# PSRemotingProtocolVersion 2.3
# SerializationVersion 1.1.0.1

PS C:\Program Files> $PSVersionTable.PSVersion
# Major Minor Build Revision
# ----- ----- ----- --------
# 5 1 19041 610

# 方式2.采用host得方式
PS C:\Program Files> Get-Host
PS C:\Program Files> Host
Name : ConsoleHost
Version : 5.1.19041.610 # 当前版本
InstanceId : 3af22fd4-3ade-4c0d-ab67-7c77cf08223a
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : zh-CN
CurrentUICulture : zh-CN
PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled : True
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspace


Get-Help 命令 - PS命令帮助

描述: Get-Help 是多用途命令, 其作用是帮助你了解找到CmdLet 命令后如何使用它们, 如果使用的是 help 函数man 别名(而不是 Get-Help cmdlet)则不会收到此提示Do you want to run Update-Help?

Tips : Get-Help 也可用于帮助查找 PowerShell 相关命令,但与 Get-Command 相比它采用不同且较为间接的方式

语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
# SYNTAX
Get-Help [[-Name] <string>] [<CommonParameters>]

# OPTIONS
-Category <string[]>
-Component <string[]>
-Functionality <string[]>
-Name <string>
-Parameter <string>
-Path <string>
-Role <string[]>
<CommonParameters>


基础实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1.例如下面的命令显示 Get-Service cmdlet 的输出对象成员的相关信息。
Get-help Get-service
Get-Help Get-Service -Online #若要联机查看此 cmdlet 的帮助主题,转到 https://go.microsoft.com/fwlink/?LinkID=113332
#备注:Get-Help 在此计算机上找不到该 cmdlet 的帮助文件它仅显示部分帮助。


# 2.若要在会话中获取所有 cmdlet 帮助文章的列表请键入
Get-Help -Category Cmdlet
Get-Help Get-ChildItem -Detailed # 若要显示详细信息,请使用Detailed 参数
Get-Help Get-ChildItem -Full # 若要显示帮助文章中的所有内容,请使用 Full 参数
Get-Help Get-ChildItem -Parameter * # 若要获取有关 cmdlet 的参数的详细帮助,请使用的 Parameter 参数

# 3.获取Cmdlet命令显示帮助文章中的示例(实际显示名称、别名、备注)
Get-Help Get-ChildItem -Examples

# 4.获取有关脚本和函数的帮助
Get-Help c:\ps-test\TestScript.ps1 # 但是在运行 Get-Help * 时不会显示函数和脚本的帮助

# 5.单独的可搜索窗口中打开帮助主题
Get-Help -Name Get-Command -ShowWindow

# 6.如果只找到一个结果,将显示帮助主题本身,而不显示命令列表。
Get-Help *hotfix*

WeiyiGeek.在窗口中打开帮助主题

WeiyiGeek.在窗口中打开帮助主题

Tips : 例如,无法同时指定 Full 和 Detailed 参数,因为它们位于不同的参数集中 。

Tips : 使用 Get-Help 搜索 PowerShell 命令时,使用更宽泛而不是更具体的搜索信息,例如 Get-Help process


Update-Help 命令 - PS命令更新帮助

描述: Update-Help cmdlet 用于更新帮助主题,建议定期更新帮助系统,因为可能会不时更新帮助内容。

Tips : 默认情况下,它需要访问 Internet,并且你需要以管理员身份运行提升的 PowerShell。

基础实例:

1
2
3
4
5
# 1.更新系统中所有命令的文档
Update-Help

# 2.更新指定cmdlet命令帮助文档
Update-Help Get-service

WeiyiGeek.Update-Help

WeiyiGeek.Update-Help

Tips : 如果计算机无法访问 Internet,则可以在另一台可以访问互联网的机器上使用 Save-Help cmdlet,首先将更新后的帮助信息保存到网络上的文件共享中,然后使用 Update-Help 的 SourcePath 参数为帮助主题指定此网络位置。


Help 函数 与 Man 命令帮助

描述:若要一次显示每篇帮助文章的一页,请使用 help 函数或其别名 man

基础实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1.例如,若要显示 Get-ChildItem cmdlet 的帮助信息
man Get-ChildItem
help Get-ChildItem

# 2.最后两个选项每次返回一页以外,结果都一样
help -Name Get-Help -Full
help Get-Help -Full

# 3.如果需要在单独的窗口中显示帮助,建议使用 Online 参数或 Full 参数,并通过管道将结果传递给 Out-GridView;
help Get-Command -Full | Out-GridView


# 4.对 Name 参数使用星号 (*) 通配符, 指定搜索命令时使用的字词作为 Name 参数的值
PS C:\Users\WeiyiGeek> help *process*
PS C:\Users\WeiyiGeek> help *-process
# Name Category Module Synopsis
# ---- -------- ------ --------
# Debug-Process Cmdlet Microsoft.PowerShell.M... ...
# Get-Process Cmdlet Microsoft.PowerShell.M... ...
# Start-Process Cmdlet Microsoft.PowerShell.M... ...
# Stop-Process Cmdlet Microsoft.PowerShell.M... ...
# Wait-Process Cmdlet Microsoft.PowerShell.M... ...
PS C:\Users\WeiyiGeek> help get-*

WeiyiGeek.Out-GridView

WeiyiGeek.Out-GridView

Tips : 使用 Help 函数时,可使用空格键显示下一页内容,可使用 Ctrl+C 取消在 PowerShell 控制台中运行的命令。

Tips : 除非将 通配符添加到 `prcess` 的开头或开头和结尾,否则该命令不返回任何结果。

Tips : 即 PowerShell 中的 Help 不是只能找到具有帮助主题的命令,例如help *more*其没有帮助主题,但 PowerShell 中的 Help 系统仍可以找到它。但它只找到一个匹配项,并返回了基本的语法信息,如果命令没有帮助主题,就会看到这些信息


Get-Command 命令 - 查询系统上的PS命令

描述:Get-Command 的作用是帮助查找命令,我们可以采用通配符进行匹配查看指定cmdlet命令或者运行不带任何参数的 Get-Command 会返回系统上所有命令的列表。

语法参数:

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
# 别名
gcm

# 语法
Get-Command [[-ArgumentList] <Object[]>] [<CommonParameters>]
Get-Command [[-Name] <string[]>] [[-ArgumentList] <Object[]>] [<CommonParameters>]

# 参数
-All
-ArgumentList <Object[]>
-CommandType <CommandTypes>
-FullyQualifiedModule <ModuleSpecification[]>
-ListImported
-Module <string[]>
-Name <string[]>
-Noun <string[]>
-ParameterName <string[]>
-ParameterType <PSTypeName[]>
-ShowCommandInfo
-Syntax
-TotalCount <int>
-Verb <string[]>

# 输入
System.String[]
Microsoft.PowerShell.Commands.ModuleSpecification[]
System.Management.Automation.CommandTypes
System.Int32
System.Management.Automation.SwitchParameter
System.Object[]

# 输出
System.Management.Automation.AliasInfo
System.Management.Automation.ApplicationInfo
System.Management.Automation.FunctionInfo
System.Management.Automation.CmdletInfo
System.Management.Automation.ExternalScriptInfo
System.Management.Automation.FilterInfo
System.Management.Automation.WorkflowInfo
System.String
System.Management.Automation.PSObject

基础实例:

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
# 1.查看指定的Cmdlet命令/Function的信息
PS> Get-Command -Name Clear-Host
# CommandType Name Version Source
# ----------- ---- ------- ------
# Function Clear-Host


# 2.例如若要查找用于查看和更改 Windows 服务的 cmdlet 列表,请键入:
PS> Get-Command *-Service
PS> Get-Command -Name *service*
PS> Get-Command -Noun Service #使用 Noun 参数查看将对同一类型的对象产生影响的命令系列,效果同上|
# CommandType Name Version Source
# ----------- ---- ------- ------
# Cmdlet Get-Service 3.1.0.0 Microsoft.PowerShell.Management
# Cmdlet New-Service 3.1.0.0 Microsoft.PowerShell.Management
# ...

# 3.例如若要查看使用动词 Get 的所有 cmdlet
PS> Get-Command -Verb Get # Verb 参数列出包含特定动词的所有命令(以Get开头的Cmdlet命令)
# CommandType Name Version Source
# ----------- ---- ------- ------
# Alias Get-AppPackage 2.0.1.0 Appx
# Alias Get-AppPackageDefaultVolume 2.0.1.0 Appx


# 4.获取有关命令的信息返回每个 cmdlet 语法的 Syntax 参数
PS> Get-Command Get-Help -Syntax
# Get-Help [[-Name] <string>] [-Path <string>] [-Category <string[]>] [-Component <string[]>] [-Functionality <string[]>] [-Role <string[]>] [-Full] [<CommonParameters>]


# 5.使用 CommandType 参数可以获取其他类型的本机命令
PS> Get-Command -Name *service* -CommandType Cmdlet, Function, Alias, Script
# CommandType Name Version Source
# ----------- ---- ------- ------
# Function Get-NetFirewallServiceFilter 2.0.0.0 NetSecurity
# Function Set-NetFirewallServiceFilter 2.0.0.0 NetSecurity
# Cmdlet Get-Service 3.1.0.0 Microsoft.PowerShell.Management
# Cmdlet New-Service 3.1.0.0 Microsoft.PowerShell.
.....
# Cmdlet Stop-Service 3.1.0.0 Microsoft.PowerShell.Management
# Cmdlet Suspend-Service 3.1.0.0 Microsoft.PowerShell.Management

Tips : 更好的选择是使用 Verb 或/和 Noun 参数,因为只有 PowerShell 命令同时具有谓词和名词 。


Get-Alias 命令 - 获取别名

描述: Get-Alias cmdlet 显示与别名关联的本机 PowerShell 命令的真实名称。

PS 别名表:

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
CommandType     Name                                               Version    Source                                   
----------- ---- ------- ------
Alias % -> ForEach-Object
Alias ? -> Where-Object
Alias ac -> Add-Content
Alias asnp -> Add-PSSnapin
Alias cat -> Get-Content
Alias cd -> Set-Location
Alias CFS -> ConvertFrom-String 3.1.0.0 Microsoft.PowerShell.Utility
Alias chdir -> Set-Location
Alias clc -> Clear-Content
Alias clear -> Clear-Host
Alias clhy -> Clear-History
Alias cli -> Clear-Item
Alias clp -> Clear-ItemProperty
Alias cls -> Clear-Host
Alias clv -> Clear-Variable
Alias cnsn -> Connect-PSSession
Alias compare -> Compare-Object
Alias copy -> Copy-Item
Alias cp -> Copy-Item
Alias cpi -> Copy-Item
Alias cpp -> Copy-ItemProperty
Alias curl -> Invoke-WebRequest
Alias cvpa -> Convert-Path
Alias dbp -> Disable-PSBreakpoint
Alias del -> Remove-Item
Alias diff -> Compare-Object
Alias dir -> Get-ChildItem
Alias dnsn -> Disconnect-PSSession
Alias ebp -> Enable-PSBreakpoint
Alias echo -> Write-Output
Alias epal -> Export-Alias
Alias epcsv -> Export-Csv
Alias epsn -> Export-PSSession
Alias erase -> Remove-Item
Alias etsn -> Enter-PSSession
Alias exsn -> Exit-PSSession
Alias fc -> Format-Custom
Alias fhx -> Format-Hex 3.1.0.0 Microsoft.PowerShell.Utility
Alias fl -> Format-List
Alias foreach -> ForEach-Object
Alias ft -> Format-Table
Alias fw -> Format-Wide
Alias gal -> Get-Alias
Alias gbp -> Get-PSBreakpoint
Alias gc -> Get-Content
Alias gcb -> Get-Clipboard 3.1.0.0 Microsoft.PowerShell.Management
Alias gci -> Get-ChildItem
Alias gcm -> Get-Command
Alias gcs -> Get-PSCallStack
Alias gdr -> Get-PSDrive
Alias ghy -> Get-History
Alias gi -> Get-Item
Alias gin -> Get-ComputerInfo 3.1.0.0 Microsoft.PowerShell.Management
Alias gjb -> Get-Job
Alias gl -> Get-Location
Alias gm -> Get-Member
Alias gmo -> Get-Module
Alias gp -> Get-ItemProperty
Alias gps -> Get-Process
Alias gpv -> Get-ItemPropertyValue
Alias group -> Group-Object
Alias gsn -> Get-PSSession
Alias gsnp -> Get-PSSnapin
Alias gsv -> Get-Service
Alias gtz -> Get-TimeZone 3.1.0.0 Microsoft.PowerShell.Management
Alias gu -> Get-Unique
Alias gv -> Get-Variable
Alias gwmi -> Get-WmiObject
Alias h -> Get-History
Alias history -> Get-History
Alias icm -> Invoke-Command
Alias iex -> Invoke-Expression
Alias ihy -> Invoke-History
Alias ii -> Invoke-Item
Alias ipal -> Import-Alias
Alias ipcsv -> Import-Csv
Alias ipmo -> Import-Module
Alias ipsn -> Import-PSSession
Alias irm -> Invoke-RestMethod
Alias ise -> powershell_ise.exe
Alias iwmi -> Invoke-WmiMethod
Alias iwr -> Invoke-WebRequest
Alias kill -> Stop-Process
Alias lp -> Out-Printer
Alias ls -> Get-ChildItem
Alias man -> help
Alias md -> mkdir
Alias measure -> Measure-Object
Alias mi -> Move-Item
Alias mount -> New-PSDrive
Alias move -> Move-Item
Alias mp -> Move-ItemProperty
Alias mv -> Move-Item
Alias nal -> New-Alias
Alias ndr -> New-PSDrive
Alias ni -> New-Item
Alias nmo -> New-Module
Alias npssc -> New-PSSessionConfigurationFile
Alias nsn -> New-PSSession
Alias nv -> New-Variable
Alias ogv -> Out-GridView
Alias oh -> Out-Host
Alias popd -> Pop-Location
Alias ps -> Get-Process
Alias pushd -> Push-Location
Alias pwd -> Get-Location
Alias r -> Invoke-History
Alias rbp -> Remove-PSBreakpoint
Alias rcjb -> Receive-Job
Alias rcsn -> Receive-PSSession
Alias rd -> Remove-Item
Alias rdr -> Remove-PSDrive
Alias ren -> Rename-Item
Alias ri -> Remove-Item
Alias rjb -> Remove-Job
Alias rm -> Remove-Item
Alias rmdir -> Remove-Item
Alias rmo -> Remove-Module
Alias rni -> Rename-Item
Alias rnp -> Rename-ItemProperty
Alias rp -> Remove-ItemProperty
Alias rsn -> Remove-PSSession
Alias rsnp -> Remove-PSSnapin
Alias rujb -> Resume-Job
Alias rv -> Remove-Variable
Alias rvpa -> Resolve-Path
Alias rwmi -> Remove-WmiObject
Alias sajb -> Start-Job
Alias sal -> Set-Alias
Alias saps -> Start-Process
Alias sasv -> Start-Service
Alias sbp -> Set-PSBreakpoint
Alias sc -> Set-Content
Alias scb -> Set-Clipboard 3.1.0.0 Microsoft.PowerShell.Management
Alias select -> Select-Object
Alias set -> Set-Variable
Alias shcm -> Show-Command
Alias si -> Set-Item
Alias sl -> Set-Location
Alias sleep -> Start-Sleep
Alias sls -> Select-String
Alias sort -> Sort-Object
Alias sp -> Set-ItemProperty
Alias spjb -> Stop-Job
Alias spps -> Stop-Process
Alias spsv -> Stop-Service
Alias start -> Start-Process
Alias stz -> Set-TimeZone 3.1.0.0 Microsoft.PowerShell.Management
Alias sujb -> Suspend-Job
Alias sv -> Set-Variable
Alias swmi -> Set-WmiInstance
Alias tee -> Tee-Object
Alias trcm -> Trace-Command
Alias type -> Get-Content
Alias wget -> Invoke-WebRequest
Alias where -> Where-Object
Alias wjb -> Wait-Job
Alias write -> Write-Output

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1.获取别名的真实命令
PS > Get-Alias cat
# CommandType Name Version Source
# ----------- ---- ------- ------
# Alias cat -> Get-Content
PS > Get-Alias cls, gcm, gm
# Alias cls -> Clear-Host
# Alias gcm -> Get-Command
# Alias gm -> Get-Member


# 2.如果要查找指定Cmdlet命令的别名,需要使用 Definition 参数。
PS > Get-Alias -Definition Get-Command, Get-Member
# CommandType Name Version Source
# ----------- ---- ------- ------
# Alias gcm -> Get-Command
# Alias gm -> Get-Member

WeiyiGeek.Get-Alias

WeiyiGeek.Get-Alias


Set-Aliase 命令 - 设置别名

描述:可以使用 Set-Alias cmdlet 创建自己的别名。

1
2
#1.PS设置别名样式
Set-Alias -Name gi -Value Get-Item

注意: PS内置别名无法被修改,否则会报错 Set-Alias :别名不可写入,因为别名 gi 为只读别名或常量,无法写入。


Get-PSProvider 命令 - 内置程序

描述: PowerShell 中的提供程序是一种允许文件系统访问数据存储的接口, 即PS中提供了许多内置程序可以采用Get-PSProvider命令查看。

Tips : 命令输出存在用于注册表、别名、环境变量、文件系统、函数、变量、证书和 WSMan 的内置提供程序,驱动器详细一览。

1
2
3
4
5
6
7
Alias 	      管理别名           	  Dir Alias:  $alias:Dir
Environment 访问环境变量的提供者 Dir env: $env:windir
Function 列出所有定义的函数, Dir function: $function:tabexpansion
FileSystem 访问驱动器,目录和文件 Dir c: $(c:\autoexec.bat)
Registry 访问Windows注册表 Dir variable: $variable:pshome
Variable 管理定义在控制台中的所有变量 Dir variable: $variable:pshoMe
Certificate 访问证书存储区的所有证书 Dir cert: Dir CurrentUser\TrustedPublisher


基础实例:

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
46
47
48
49
50
51
52
# 1.此命令显示所有可用Windows PowerShell提供程序的列表。
Get-PSProvider
# Name Capabilities Drives
# ---- ------------ ------
# Registry ShouldProcess, Transactions {HKLM, HKCU}
# Alias ShouldProcess {Alias}
# Environment ShouldProcess {Env}
# FileSystem Filter, ShouldProcess, Credentials {C, D, E, F...}
# Function ShouldProcess {Function}
# Variable ShouldProcess {Variable}
# Certificate ShouldProcess {Cert}
# WSMan Credentials {WSMan}

# 2.显示以指定字母开头的所有Windows PowerShell提供程序的列表
Get-PSProvider f*, r* | Format-List
# Name : FileSystem
# Drives : {C, D, E, F...}
# Path :
# Home : C:\Users\WeiyiGeek
# Description :
# Capabilities : Filter, ShouldProcess, Credentials
# ImplementingType : Microsoft.PowerShell.Commands.FileSystemProvider


# 3.查找将提供程序添加到会话的管理单元或模块
Get-PSProvider | Format-Table name, module, pssnapin -auto
# Name Module PSSnapIn
# ---- ------ --------
# Test TestModule
# WSMan Microsoft.WSMan.Management
# ....
# PS C:\> Get-PSProvider | Where {$_.pssnapin -eq "Microsoft.PowerShell.Security"}

# 4.第三方模块(例如 Active Directory PowerShell 模块和 SQL Server PowerShell 模块)都添加了自己的 PowerShell 提供程序和 PSDrive。
# 例如: 导入 Active Directory 和 SQL Server PowerShell 模块。
Import-Module -Name ActiveDirectory, SQLServer
# 检查以确定是否添加了任何其他 PowerShell 提供程序。
Get-PSProvider

# 5.查看那些注册表驱动器已经被注册表提供程序被使用
Get-PSDrive -PSProvider Registry
# Name Used (GB) Free (GB) Provider Root CurrentLocation
# ---- --------- --------- -------- ---- ---------------
# HKCU Registry HKEY_CURRENT_USER
# HKLM Registry HKEY_LOCAL_MACHINE
# - 注册表包含的根节点远不止两个我们可以自己创建
New-PSDrive -name HKCR -PSProvider registry -root HKLM:\SOFTWARE\Classes
# Name Used (GB) Free (GB) Provider Root CurrentLocation
# ---- --------- --------- -------- ---- ---------------
# HKCR Registry HKEY_LOCAL_MACHINE\SOFTWARE\Classes
# HKCU Registry HKEY_CURRENT_USER
# HKLM Registry HKEY_LOCAL_MACHINE


0x04 PS 脚本执行策略

描述: PowerShell的执行策略是一项安全功能有助于防止执行防止用户无意间运行脚本或者恶意脚本,可控制PS加载配置文件和运行脚本的条件。

Tips : 本地计算机和当前用户的执行策略存储在注册表中,您无需在PowerShell配置文件中设置执行策略,并且特定会话的执行策略仅存储在内存中,并且在关闭会话时丢失。

当前 Windows 操作系统的默认执行策略。

1
2
3
4
Windows 操作系统版本	默认执行策略
Server 2019 远程签名
Server 2016 远程签名
Windows 10 受限


PowerShell 管理执行策略

  • Get-ExecutionPolicy :要获取影响当前会话的所有执行策略;
  • Set-ExecutionPolicy :设置当前会话的执行策略;


执行策略列表(List Execution Policoes):

  • AllSigned: 签名认证,要求所有脚本和配置文件均由受信任的发布者签名,包括您在本地计算机上编写的脚本。
  • Bypass: 没有任何阻止也没有警告或提示;此执行策略设计用于将PowerShell脚本内置到更大的应用程序中的配置,或者用于以PowerShell为具有自己的安全模型的程序的基础的配置。
  • Default: 设置默认执行策略,WindowsPC端默认Restricted ,Windows服务器默认策略RemoteSigned
  • RemoteSigned: 服务器默认执行策略。脚本可以进行执行,需要从可信任的发布者处获得从互联网上下载的脚本和配置文件的数字签名,可能会运行来自Internet以外来源和已签名但恶意的脚本的未签名脚本。
  • Restricted: 严格模式,Windows客户端计算机的默认执行策略。允许使用单个命令但不允许使用脚本。阻止运行所有脚本文件,包括格式和配置文件.ps1xml , 模块脚本 .psm1 , PS配置文件.ps1;
  • Unrestricted: 未签名的脚本可以运行。有运行恶意脚本的风险。 在运行非本地Intranet区域中的脚本和配置文件之前警告用户


执行策略范围:

  • MachinePolicy: 由组策略为计算机的所有用户设置。
  • UserPolicy: 由组策略为计算机的当前用户设置。
  • Process: 进程作用域仅影响当前的PowerShell会话。
  • CurrentUser: 执行策略仅影响当前用户。它存储在HKEY_CURRENT_USER注册表子项中。
  • LocalMachine: 执行策略会影响当前计算机上的所有用户。它存储在HKEY_LOCAL_MACHINE注册表子项中

基础实例:

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
#1.获取查看当前会话用户(以及计算机执行策略范围)执行策略权限
PS C:\WeiyiGeek> Get-ExecutionPolicy
Restricted

PS C:\WeiyiGeek> Get-ExecutionPolicy -list
# Scope ExecutionPolicy
# ----- ---------------
# MachinePolicy Undefined
# UserPolicy Undefined
# Process Undefined
# CurrentUser Undefined
# LocalMachine Unrestricted


# 2.获取指定范围执行权限
PS C:\WeiyiGeek> Get-ExecutionPolicy -Scope CurrentUser
Undefined


# 3.将 PowerShell 执行策略更改为远程签名。
PS C:\WeiyiGeek> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned


# 4.更改执行政策更改立即生效,无需重新启动PowerShell。
PS C:\WeiyiGeek> Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
PS C:\WeiyiGeek> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser


# 5.由于已将执行策略设置为 RemoteSigned Stop-TimeService.ps1 脚本将正常运行。
echo "Get-Service -Name W32Time | Stop-Service -PassThru" > Stop-TimeService.ps1
.\Stop-TimeService.ps1

WeiyiGeek.ExecutionPolicy

WeiyiGeek.ExecutionPolicy

Tips : 在Windows各版本机器下必须以管理员权限运行Powershell采用运行上述的cmdlet;


0x05 PS 术语表

术语 定义
二进制模块 一个 PS 模块其根模块是一个二进制模块文件 (.dll)。 二进制模块可能包含或不包含模块清单。
通用参数 一个参数它由 PS 引擎添加到所有 cmdlet、高级函数和工作流中。
使用点获取来源 在 PS 中若要启动一个命令,可在该命令前键入一个点和一个空格。 采用点获取其来源的命令运行在当前范围而非新范围中。 命令创建的任何变量、别名、函数或驱动器都创建于当前范围,并在命令完成时提供给用户。
动态模块 一个仅存在于内存中的模块。 New-Module 和 Import-PSSession cmdlet 会创建动态模块。
动态参数 在某些情况下添加到 PS cmdlet、函数或脚本的一个参数。 Cmdlet、函数、提供程序和脚本可以添加动态参数。
格式设置文件 一个 PS XML 文件,它具有 .format.ps1xml 扩展名且定义 PS 如何基于对象的 .NET Framework 类型来显示对象。
全局会话状态 包含 PS 会话用户可访问的数据的会话状态。
主机 PS 引擎用于与用户进行通信的接口。 例如,主机指定 PS 和用户之间处理提示的方式。
主机应用程序 将 PS 引擎加载到其进程中并使用它执行操作的程序。
输入处理方法 Cmdlet 可用于处理其以输入形式所接收的记录的一种方法。 输入处理方法包括 BeginProcessing 方法、ProcessRecord 方法、EndProcessing 方法以及 StopProcessing 方法。
清单模块 一个 PS 模块,它具有一个清单且其 RootModule 项为空。
模块清单 一个 PS 数据文件 (.psd1),描述模块的内容并控制模块的处理方式。
模块会话状态 包含 PS 模块公用和专用数据的会话状态。 此会话状态中的私有数据不可供 PS 会话的用户使用。
非终止错误 不能阻止 PS 继续处理命令的错误。
名词 在 PS cmdlet 名称中连字符后面的单词。 名词描述了 cmdlet 在其上进行操作的资源。
参数集 可用于相同的命令中以执行特定操作的一组参数。
在 PS 中,将前一个命令的结果作为输入发送到管道中的下一个命令。
管道 一系列由管道运算符 (` `) (ASCII 124) 连接的命令。 每个管道运算符将前一个命令的结果作为输入发送到下一个命令。
PSSession 一种由用户创建、管理和关闭的 PS 会话类型。
根模块 在模块清单的 RootModule 项中指定的模块。
运行空间 在 PS 中,在其中执行管道中每个命令的操作环境。
脚本块 在 PS 编程语言中,可作为单个单元使用的语句或表达式的一个集合。 脚本块可以接受参数并返回值。
脚本模块 一个 PS 模块,其根模块是一个脚本模块文件 (.psm1);脚本模块可能包含或不包含模块清单。
脚本模块文件 一个包含 PS 脚本的文件。 该脚本定义脚本模块导出的成员。 脚本模块文件具有 .psm1 文件扩展名。
shell 用于将命令传递到操作系统的命令解释器。
开关参数 一个不带实参的形参。
终止错误 阻止 PS 处理命令的错误。
事务 一个工作的原子单元,必须将事务中的工作作为一个整体来完成;如果该事务的任何部分失败,那么整个事务都会失败。
类型文件 一个 PS XML 文件,它具有.ps1xml 扩展名且扩展 PS 中 Microsoft.NET Framework 类型的属性。
动作 在 PS cmdlet 名称中连字符前面的单词,它说明该 cmdlet 将执行的操作。
PS 为IT管理员提供全面控制以及实现系统管理任务自动化的一个命令行 Shell 和基于任务的脚本技术;
PS命令 导致操作被执行的管道中的元素。PS 命令可以在键盘上输入或以编程方式调用。
PS数据文件 具有 .psd1 文件扩展名的文本文件。 PS 将数据文件用于多种用途,例如存储模块清单数据和存储用于脚本国际化的已翻译的字符串。
PS驱动器 一个提供直接访问数据存储的虚拟驱动器。 它可以由 PS 提供程序定义或是在命令行中创建。 在命令行创建的驱动器是特定于会话的驱动器,并在会话关闭时丢失。
PS集成脚本环境 (ISE) 一个 PS 主机应用程序,使你能够运行命令并在友好、语法着色、符合 Unicode 的环境中编写、测试和调试脚本。
PS模块 一个独立的可重用单元,使你能够对 PS 代码进行分区、组织和抽象化。 模块可以包含 cmdlet、提供程序、函数、变量和其他可作为单个单元导入的资源类型。
PS提供程序 一个基于 Microsoft .NET Framework 的程序,用于使专用数据存储中的数据在 PS 中可用,以便你可以查看和管理它。
PS脚本 以 PS 语言编写的脚本。
PS脚本文件 具有 .ps1 扩展名且包含以 PS 语言编写的脚本的文件。
PS管理单元 定义一组可以添加到 PS 环境中的 cmdlet、提供程序和 Microsoft .NET Framework 的资源。
PS工作流程 工作流是一系列经过编程的连接步骤,会执行长期运行的任务,或是需要在多个设备或托管节点之间协调多个步骤。
PS工作流使IT专业人员和开发人员可以按工作流的形式创作多设备管理活动序列,或工作流中的单个任务。 PS 工作流使你能够调整 PS 脚本和 XAML 并将其作为工作流运行。

0x06 学习建议

描述: 本章了解了PS的简单使用,以及遇到了没见过或者是不会使用的cmdlet命令,我们应该如何的获取我们想要得到的信息或者说是语法实例,但是对于学习PS编程来说语法其实难而难点在于需要记得PS常用cmdlet的作用及其使用技巧,所以为了更好的学习PS总结了如下建议。

  • 0.多多查看参考Microsoft官网中PowerShell脚本示例。

  • 1.每天学习一个 PowerShell 命令。

    1
    Get-Command | Get-Random | Get-Help -Full
  • 2.记录某些cmdlet命令联合使用的示例并加以说明以便后续查阅。