suncool 发表于 2018-9-3 06:33:41

PowerShell签名和执行策略

  转载自: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= 发布的。此发布者在您的系统上不受信任。请只运行来自可信发布者的脚本。
   从不运行 不运行 运行一次 始终运行
  [?] 帮助(默认选择是“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
  指纹                                    使用者
  ----------                              -------
  4D4917CB140714BA5B81B96E0B18AAF2C4564FDFCN=PowerShell User ]
  对脚本进行签名
  -------------
  如果您具有自签名证书,则可对脚本进行签名。如果使用 AllSigned 执行策略,则对脚本进行签名允许您在您的计算机上运行该脚本。
  以下示例脚本 sign-file.ps1 可对脚本进行签名。但如果使用 AllSigned 执行策略,则必须在运行 sign-file.ps1 之前对其进行签名。
  若要使用此脚本,请将以下文本复制到文本文件中并将该文本文件命名为
  sign-file.ps1。
  (请确保该脚本文件没有 .txt 文件扩展名。如果文本编辑器向其追加 .txt,则请将
  文件名括在引号中,例如“sign-file.ps1”。)

[*]  ## sign-file.ps1
[*]  ## 对文件进行签名
[*]  param( $file=$(throw"请指定文件名。"))
[*]  $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)
[*]  Set-AuthenticodeSignature $file $cert
  若要对 sign-file.ps1 进行签名,请在 PowerShell 命令提示符下键入以下命令:

[*]  $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)
[*]  Set-AuthenticodeSignature sign-file.ps1 $cert
  在对脚本进行签名之后,即可在本地计算机上运行该脚本。但是,如果计算机上的PowerShell 执行策略要求来自可信证书颁发机构的数字签名,则此脚本将无法在该计算机上运行。如果您试图这样做,则 PowerShell 将报告以下错误:
  无法加载文件 C:\remote_file.ps1。无法验证该证书的签名。
  所在行:1 字符:15
  + .\ remote_file.ps1
页: [1]
查看完整版本: PowerShell签名和执行策略