Powershell默认是不允许执行PS1脚本的,这就需要我们自己使用Set-ExecutionPolicy来修改默认策略。

使用Get-ExecutionPolicy可以获取当前的策略:

PS C:\Users\lightless> Get-ExecutionPolicy
Unrestricted

如果想看更详细的,针对每个scope设置的策略,可以使用如下命令:

PS C:\Users\lightless> Get-ExecutionPolicy -List | Format-Table -AutoSize
 
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    Unrestricted
 LocalMachine       Undefined

一共有6种策略,分别是:Undefined, Bypass, Unrestricted, Remotesigned, Allsigned, Restricted.
默认情况下是Restricted策略,更详细的可以参考:https://technet.microsoft.com/library/hh847748.aspx

这里简单的说下六种策略的区别:

  • Restricted.
    不读取任何配置文件、不运行任何脚本,这个是默认策略。

  • AllSigned.
    所有的脚本和配置文件必须有受信任的的发布者的签名,就算是自己写的脚本也同样如此,否则无法执行。

  • RemoteSigned.
    和上面的类似,但是针对的是从网上下载下来的脚本,这些脚本同样也需要可信的签名。

  • Unrestricted.
    可以运行脚本或者读取配置文件,如果执行的是从网上下载的脚本,那么会有一个申请权限的提示。

  • Bypass.
    不阻止任何脚本或配置文件,也不会显示警告或者提示。

  • Undefined.
    把当前scope的所有策略全部都删除,但是不会删除Group Policy scope中的策略。如果你想删除某个设置好的策略,用这个就行了。

上面说到了scope,这个可以理解为作用域,针对不同的作用域设置不同的策略。
主要有三种scope:

  • process
    设置的策略只影响当前的powershell进程。

  • CurrentUser:
    设置的策略只影响当前用户。

  • LocalMachine:
    设置的策略影响这台计算机上的所有用户。

那么设置方法就是使用Set-ExecutionPolicy命令,具体格式如下:

Set-ExecutionPolicy [-ExecutionPolicy] <ExecutionPolicy> [[-Scope] <ExecutionPolicyScope> ] [-Force] [-Confirm] [-WhatIf] [ <CommonParameters>]
  • -Force的作用是禁止所有的提示输出,当你更改执行策略的时候,默认情况下是会显示警告的,这个选项可以让他不显示警告。
  • -Confirm会在你执行这个cmdlet之前再确认一次,以免打错命令。
  • -WhatIf会显示执行完这条cmdlet之后会发生什么事情,但是并不执行当前的cmdlet。

这个策略其实也是可以绕过的,详细的可以参考这篇文章:
https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/

参考资料:
https://technet.microsoft.com/en-us/library/hh849812.aspx
https://technet.microsoft.com/zh-cn/library/ee176961.aspx
https://technet.microsoft.com/library/hh847748.aspx