转载自: http://www.cnblogs.com/herbert/archive/2010/06/12/1756923.html
主题
签名和执行策略
简短说明
描述 Windows PowerShell 执行策略,以及如何使用和更改它们。
详细说明
PowerShell 执行策略通过确定 PowerShell 加载配置文件和运行脚本的条件,为脚本环境提供安全性。
默认设置为最安全的策略“Restricted”。该设置允许运行单个命令,但不允许运行脚本。
如果执行策略不允许 PowerShell 加载文件或运行脚本,则将显示警告以解释该 限制的原因。
“加载扩展类型数据文件时出错:”
“加载格式数据文件时出错:”
若要加载文件或运行脚本,请更改执行策略。
更改执行策略
------------------------------
您可以更改计算机上的 PowerShell 执行策略。该更改将立即生效,且一直保持到再次更改时。只有管理员才可更改该策略。
若要更改执行策略,请键入:
Set-ExecutionPolicy <策略名称>
例如,
Set-ExecutionPolicy RemoteSigned
如果该命令执行成功,则 PowerShell 将显示命令提示符。没有表示执行成功的消息。如果该命令失败,则 PowerShell 将显示一条错误消息,并还原到先前的执行策略。
若要查看 PowerShell 执行策略,请键入:
Get-ExecutionPolicy
如果该命令执行失败,则可能是由于拼错了策略名称。请检查该名称,然后重试。如果您无权运行此命令,请与系统管理员联系。
POWERSHELL 执行策略
------------------------------
PowerShell 执行策略包括:
Restricted
- 默认的执行策略。
- 允许单个命令运行,但无法运行脚本。
AllSigned
- 可以运行脚本。
- 要求可信发布者对所有脚本和配置文件(包括本地计算机上编写的脚本)的
数字签名。
- 在运行来自可信发布者的脚本之前对您进行提示。
- 运行已签名但有恶意的脚本带来的风险。
RemoteSigned
- 可以运行脚本。
- 要求可信发布者对从 Internet(包括电子邮件和即时消息程序)下载的脚本和配置文件的数字签名。
- 无需从本地计算机上运行的脚本的数字签名。
- 在运行来自可信发布者的脚本之前不向您提示。
- 运行已签名但有恶意的脚本带来的风险。
Unrestricted
- 可以运行未签名脚本。
- 在警告您文件来源于 Internet 后,运行从 Internet(包括 Microsoft Outlook、Outlook Express 和 Windows Messenger)下载的脚本和配置文件。
- 运行恶意脚本带来的风险。
运行未签名脚本(REMOTESIGNED 执行策略)
--------------------------------------------------------
如果 PowerShell 执行策略为 RemoteSigned,则 PowerShell 将不会运行从Internet(包括电子邮件和即时消息程序)下载的未签名脚本。
如果您试图运行所下载的脚本,则 PowerShell 将显示以下错误消息:
无法加载文件 C:\remote.ps1。文件 C:\remote.ps1 未经数字签名。无法在系
统中执行该脚本。有关详细信息,请参阅“Get-Help about_signing”。
在运行该脚本前,请检查其代码以确保该脚本可信。脚本与任何可执行程序具有同样的效用。
若要运行未签名脚本,请执行以下操作:
1. 将脚本文件保存在计算机中。
2. 依次单击“开始”、“我的电脑”,然后导航到保存的脚本文件。
3. 右键单击该脚本文件,然后单击“属性”。
4. 单击“取消阻止”。
如果从 Internet 下载的脚本具有数字签名,而您尚未选择信任其发布者,则
PowerShell 将显示以下消息:
是否要运行来自此不可信发布者的软件? 文件 C:\remote_file.ps1 是由 CN=<发布者名称> 发布的。此发布者在您的系统上不受信任。请只运行来自可信发布者的脚本。
[V] 从不运行 [D] 不运行 [R] 运行一次 [A] 始终运行
[?] 帮助(默认选择是“D”):
如果您信任发布者,请选择“运行一次”或“始终运行”。如果您不信任发布者,则请选择“从不运行”或“不运行”。如果选择“从不运行”或“始终运行”,则 PowerShell 将不再针对此发布者提醒您。
对脚本进行签名的方法
------------------------------------------
可以对编写的脚本以及来自其他源的脚本进行签名。在对任何脚本进行签名前,请检查每条命令并验证运行此脚本是安全的。
有关如何在 PowerShell 命令行中对脚本文件进行签名的详细信息,请键入:
Get-Help Set-AuthenticodeSignature
若要为脚本添加数字签名,则必须使用代码签名证书对其进行签名。对脚本文件进行签名可使用以下两种类型的证书:
-- 由证书颁发机构创建的证书:
公共证书颁发机构可验证您的身份并向您颁发代码签名证书,但要收取费用。
在从可信的证书颁发机构购买证书之后,您将可以与运行 Windows 的其他计
算机上的用户共享该脚本,因为其他计算机信任该证书颁发机构。
-- 您创建的证书:
您可以创建“自签名证书”,而您的计算机就是创建该证书的颁发机构。这类证
书是免费的,它允许您在您的计算机上编写、签名和运行脚本,但是其他计算
机不信任您的计算机,可能不会运行该脚本。
如果您创建了自签名证书,请确保为您的证书启用强私钥保护。从而防止恶意
程序以您的名义对脚本进行签名。本主题的最后部分将提供这些说明。
创建自签名证书
-------------------------------------------------------------
若要创建自签名证书,请使用 MakeCert.exe(一种工具,包含在 Microsoft .NETFramework SDK(1.1 及更高版本)和 Microsoft Platform SDK 中)。
若要使用 MakeCert 来创建证书,请执行以下操作:
在 SDK 命令提示符窗口中,运行以下命令:
第一条命令将为计算机创建本地证书颁发机构。第二条命令从该证书颁发机构生
成个人证书:
makecert -n "CN=PowerShell Local Certificate Root" -a sha1 `
-eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer `
-ss Root -sr localMachine
makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 `
-eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer
MakeCert 将提示您输入私钥密码。
若要验证生成的证书是否正确,请执行以下操作:
在 PowerShell 提示符下键入:
get-childitem cert:\CurrentUser\My -codesigning
此命令使用 PowerShell 证书提供程序来查看该证书的相关信息。
如果该证书已创建完成,则输出将显示该证书的指纹,其中包含 PowerShell 用户的身份验证数据,如下所示:
目录: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
指纹 使用者
---------- -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF CN=PowerShell User ]
对脚本进行签名
-------------
如果您具有自签名证书,则可对脚本进行签名。如果使用 AllSigned 执行策略,则对脚本进行签名允许您在您的计算机上运行该脚本。
以下示例脚本 sign-file.ps1 可对脚本进行签名。但如果使用 AllSigned 执行策略,则必须在运行 sign-file.ps1 之前对其进行签名。
若要使用此脚本,请将以下文本复制到文本文件中并将该文本文件命名为
sign-file.ps1。
(请确保该脚本文件没有 .txt 文件扩展名。如果文本编辑器向其追加 .txt,则请将
文件名括在引号中,例如“sign-file.ps1”。)
## sign-file.ps1
## 对文件进行签名
param([string] $file=$(throw"请指定文件名。"))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $cert
若要对 sign-file.ps1 进行签名,请在 PowerShell 命令提示符下键入以下命令:
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature sign-file.ps1 $cert
在对脚本进行签名之后,即可在本地计算机上运行该脚本。但是,如果计算机上的PowerShell 执行策略要求来自可信证书颁发机构的数字签名,则此脚本将无法在该计算机上运行。如果您试图这样做,则 PowerShell 将报告以下错误:
无法加载文件 C:\remote_file.ps1。无法验证该证书的签名。
所在行:1 字符:15
+ .\ remote_file.ps1 <<<< 无法加载文件 C:\remote_file.ps1。无法验证该证书的签名。
所在行:1 字符:15
+ .\ remote_file.ps1 <<<<
如果在运行非您编写的脚本时 PowerShell 显示此消息,请按照处理任何未签名脚本的方式来处理该文件。检查代码,如果代码可信,则对其进行签名并运行。
为证书启用强私钥保护
---------------------------------------------------------
如果您的计算机上具有私人证书,则恶意程序可能会以您的名义对脚本进行签名,从而导致授权 PowerShell 运行这些脚本。
若要防止以您的名义进行的自动签名,请使用证书管理器工具 (Certmgr.exe) 将您的签名证书导出到 .pfx 文件中。证书管理器包含在Microsoft .NET Framework SDK、Microsoft Platform SDK,以及 Internet Explorer 5.0 及更高版本中。
若要导出证书,请执行以下操作:
1. 启动证书管理器( GUI 工具)。
2. 选择由“PowerShell Local Certificate Root”颁发的证书。
3. 单击“导出”以启动证书导出向导。
4. 选中“是,导出私钥”,然后单击“下一步”。
5. 选中“启用加强保护”。
6. 键入密码,然后再次键入密码进行确认。
7. 键入文件扩展名为 .pfx 的文件名。
8. 单击“完成”。
若要重新导入证书,请执行以下操作:
1. 启动证书管理器( GUI 工具)。
2. 单击“导入”以启动证书导入向导。
3. 浏览到您在导出过程中创建 .pfx 文件的位置。
4. 在“密码”页上选中“启用强私钥保护”,然后输入导出过程中所指定的密码。
5. 选择“个人”证书存储。
6. 单击“完成”。
另请参阅
有关代码签名的信息,请在 http://msdn.microsoft.com/ 的 Microsoft Developer Network (MSDN) 参考资料中搜索“Introduction to Code Signing” (代码签名简介)。
有关 Set-AuthenticodeSignature 命令的信息,请在 PowerShell 命令提示符下输入以下命令:
help Set-AuthenticodeSignature
转载自: http://www.cnblogs.com/herbert/archive/2010/06/12/1756923.html
转载于:https://blog.51cto.com/netside/1354161