PowerShell 脚本执行策略
为防止恶意脚本的执行,PowerShell 中设计了一个叫做执行策略(Execution Policy)的东西(我更倾向于把它叫做脚本执行策略)。我们可以在不同的应用场景中设置不同的策略来防止恶意脚本的执行。本文主要是解释这些执行策略,因为笔者在学习的时候发现它们并不是那么清晰易懂。
PowerShell 提供了 Restricted、AllSigned、RemoteSigned、Unrestricted、Bypass、Undefined 六种类型的执行策略,接下来我们一一介绍。
Restricted
单词 Restricted 的意思是 "受限制的",所以这种执行策略主要是限制脚本的执行。说简单点就是:可以执行单个的命令,但是不能执行脚本。当执行策略为 Restricted 时运行脚本会收到下面的错误:

遗憾的是在 Windows 8, Windows Server 2012, and Windows 8.1 的系统中,Restricted 被设置为默认的执行策略。所以在这些环境中要执行 PowerShell 脚本的第一件事就是调整脚本的执行策略。比如设置成不会限制脚本执行的 Bypass:
Set-ExecutionPolicy -ExecutionPolicy Bypass
注意,设置脚本的执行策略需要管理员权限,因此你需要以管理员权限启动 PowerShell ,然后执行上面的命令。
AllSigned
Signed 在这里指有数字签名的脚本,也就是说 AllSigned 执行策略允许执行所有具有数字签名的脚本。当然我们也可以换个角度说:只能运行具有数字签名的脚本。据我所知我们能见到的绝大多数的 PowerShell 脚本是没有数字签名的。如果运行没有签名的脚本,会提示下面的错误:

接下来我们要搞清楚如何给一个 PowerShell 脚本签名(打上数字签名)?并且在 AllSigned 执行策略下执行这个脚本。
给 PowerShell 脚本签名需要使用 Set-AuthenticodeSignature 命令,当然前提是你得拥有一个合法的数字证书。比如笔者使用的数字证书文件名为 test.pfx。先用数字证书文件构建一个证书对象:
$cert = Get-PfxCertificate -FilePath "test.pfx"
一般情况下都会为证书设置密码,所以这一步需要输入密码进行验证。然后为 demo.ps1 脚本文件签名:
Set-AuthenticodeSignature -FilePath "demo.ps1" `
-Certificate $cert -IncludeChain "All" `
-TimeStampServer "http://timestamp.verisign.com/scripts/timstamp.dll"

上图中最后一行中间列显示文件的前面状态为 Valid,表示已经签名成功。让我们再来看看 demo.ps1 脚本文件都发生了什么变化!打开 demo.ps1 文件的属性界面:

比原来多了一个 "Digital Signatures" 标签页,这里便是数字签名的信息。接着打开 demo.ps1 看看:

除了第一行脚本命令外,被添加了很多行的注释,这都是数字签名干的。
接下来我们在 AllSigned 执行策略下运行一下脚本 demo.ps1:

这次的提示是说你的系统还没有信任这个证书的持有者(笔者把证书持有者的信息打码了:)),要不要运行这个脚本?此时就需要用户做出判断了,如果选择 "Always run",不仅会执行该脚本,还会把该证书添加到信任列表中:

上图便是选择 "Always run" 之后证书管理器中的信息,笔者用来签名脚本的数字证书已经被添加到信任列表中了(就是右边红框中的证书信息)。一旦信任了这个数字证书,以后再执行由这个数字证书签名的脚本就不会再有提示了!
注意:数字证书的使用只是增添了一道安全机制,绝不意味着有数字签名的脚本就一定是安全可靠的。国内某证书颁发机构就因为没有底线乱发证书而被谷歌、火狐等产品移出了信任列表。既然有这样的证书颁发机构存在,就会有人借机购买数字证书并给恶意的脚本签名,所以不能仅凭是否有数字签名来区分脚本是否可信。
RemoteSigned
从 Windows Server 2012 R2 开始,PowerShell 中默认的执行策略改成了 RemoteSigned。这个执行策略的意思是:当执行从网络上下载的脚本时,需要脚本具有数字签名,否则不会运行这个脚本。如果是在本地创建的脚本则可以直接执行,不要求脚本具有数字签名。
那么问题来了,PowerShell 是如何知道脚本是本地创建的还是从网络上下载下来的?
原来,在 Windows 提供的 API 中,有个枚举可以标识文件的来源。
public enum SecurityZone
{
NoZone = -,
MyComputer = ,
Intranet = ,
Trusted = ,
Internet = ,
Untrusted = ,
}
当浏览器或者 outlook 这样的工具从网络上下载文件时,应该通过 Windows 系统提供的 API 把这个枚举的值进行更新。让我们从网络上下载一个 powershell 文(其实可以是任何文件),文件名为 0Start.ps1,右键打开属性界面:

上图红框中的内容便是对相关属性的描述。我们还可以通过命令 notepad "0Start.sp1:Zone.Identifier" 在记事本中以文本的方式显示其属性:

这里显示的已经很清楚了,ZoneId=3 表明这个文件是从网络上下载的。
Unrestricted
这是一种比较宽容的策略,允许运行未签名的脚本。对于从网络上下载的脚本,在运行前会进行安全性提示:

但这仅仅是个提示,还是允许脚本执行的。
Bypass
Bypass 执行策略对脚本的执行不设任何的限制,任何脚本都可以执行,并且不会有安全性提示。
Undefined
Undefined 表示没有设置脚本策略。当然此时会发生继承或应用默认的脚本策略。
Execution Policy Scope
Scope 指执行策略的应用范围。原来我们可以给不同的应用范围设置执行策略。比如进程、当前用户和本机。
Get-ExecutionPolicy 和 Set-ExecutionPolicy 命令默认操作的都是本机的脚本执行策略。如果要获得当前用户的执行策略可以使用 -Scope 选项:
Get-ExecutionPolicy -Scope CurrentUser
同样如果仅修改当前用户的执行策略可以在 Set-ExecutionPolicy 命令中使用 scope 参数。
Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope CurrentUser
总结
很明显,PowerShell 精心设计了脚本的执行策略。遗憾的是在 Windows 8, Windows Server 2012, and Windows 8.1 的系统中,Restricted 被设置为默认的执行策略。这让学习 PowerShell 的新手们多少有些不知所措,因为所有人都会在第一次执行脚本时遭遇不能执行的问题。还好 MS 在新的系统中把默认的执行策略改成了 RemoteSigned,至少对新手来说更友好了。
PowerShell 脚本执行策略的更多相关文章
- powershell脚本执行绕过powershell下脚本执行限制(cmd下执行)以及在cmd下隐藏脚本窗口
powershell脚本执行绕过powershell下脚本执行限制(cmd下执行) powershell脚本运行方式有两种,一种是powshell中运行,另一种是在cmd中(在某些情况下相当有用) p ...
- Windows Powershell脚本执行
在cmd下执行powershell进入shell模式: 变量定义:$i = 10 $a = ifconfig | findstr "192" Windows下的命令都可以执行如: ...
- Powershell ExecutionPolicy 执行策略
简单说明 powershell对于脚本的执行有着严格的安全限制 Get-ExecutionPolicy -List #查看当前的执行策略 Set-ExecutionPolicy -Scope Curr ...
- Powershell脚本执行权限
Powershell脚本需要使用PS1扩展名 在加载脚本前需要确认是都有执行权限,默认是Restricted(受限的), 可以执行Get-ExecutionPolicy查看权限, 一般情况下使用 Re ...
- PowerShell 脚本域策略管理
大中型企业中,会设置许多组策略进行日常运维管理 ,毕然里面也存在许多废弃的策略,需要我们定期清理我们的组策略信息.通常我们导出HTML报告方式来帮助我们分析组策略信息: #1 首先需要加载GroupP ...
- powershell 执行策略
前言 上一篇博文,我介绍了一下powershell和cmd的对比.通过学习,我发现powershell的确比cmd更加power,也更加适应现在的使用场景. 那么本文将继续介绍一个powershell ...
- 【黑客基础】Windows PowerShell 脚本学习(上)
视频地址:[黑客基础]Windows PowerShell 脚本学习 2019.12.05 学习笔记 1.$PSVersionTable :查看PowerShell的版本信息. 2.PowerShel ...
- 执行PowerShell脚本的时候出现"在此系 统上禁止运行脚本"错误
使用get-executionpolicy查看当前的脚本执行策略, 默认是Restricted, 也就是不允许任何脚本运行. 此时应该使用set-executionpolicy remotesigne ...
- 有关PowerShell脚本你必须知道的十个基本概念
1.PS1文件 一个PowerShell脚本其实就是一个简单的文本文件,这个文件包含了一系列PowerShell命令,每个命令显示为独立的一行,对于被视为PowerShell脚本的文本文件,它的文件名 ...
随机推荐
- 【Java IO流】File类的使用
File类的使用 Java中的File类是在java.io.File中,Java.IO.File类表示文件或目录. File类只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. 一 ...
- 【学习笔记】C# 抽象类
抽象类 有时设计类仅仅为了表达抽象的概念,不与具体的事物相联系,只作为其派生类的基类使用,用来描述所有子类的共同特性,这时我们可以使用抽象类 抽象类不能被实例化,抽象类可以包含抽象方法 抽象方法 抽象 ...
- 大三仍是Linux系统小白的我给大家讲讲学习历程
我与Linux结缘是在大三的时候.我与Linux熟识是在偶然遇到<Linux就该这么学>的时候.因为我是电子信息工程专业,在高年级时开设了嵌入式课程,嵌入式系统是一种专用的计算机系统,作为 ...
- plsql修改表字段alter
场景:在生产过程中有时候需要不同的环境中修改表字段,使用sql语句比较方便! 1 演示 --添加字段的语法 alter table tablename add (column datatype [de ...
- 面向Unity程序员的Android快速上手教程
作者:Poan,腾讯移动客户端开发 工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 随着Unity.cocos2dx等优秀跨平台游戏引擎的出现,开发者可以把 ...
- 【JAVASCRIPT】React学习-JSX 语法
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 JSX 语法 1. 定义 JSX 是javascript + xml 的合集,我们可以将javascript 与 ht ...
- JVM GC(整理)
1 GC类型 1 )YGC 一般情况下,当新对象生成,并且在Eden申请空间失败时,就好触发YGC ,堆Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区.然后整理S ...
- myeclipse项目部署到idea常见问题
由于myeclipse是付费产品,经过几次破解不成功后,遂弃之,转投IntelliJ IDEA门下.但这就出现一个问题了,以前用的eclipse.myeclipse以及spring tools sui ...
- java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别
这里先写几个大家容易搞混的编码设置代码: 在jsp代码中的头部往往有这两行代码 pageEncoding是jsp文件本身的编码contentType的charset是指服务器发送给客户端时的内容编码J ...
- NYOJ--187--快速查找素数(筛选法,素数打表)
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N ...