PowerShell 入门

PowerShell 是微软为 Windows 系统打造的一种命令行壳程序 + 脚本环境,主要用于系统管理与自动化任务。

Windows 11 中,直接在开始菜单搜索 PowerShell 即可。

常见的快捷方式包括(如为 64 位系统):

快捷方式名称 说明
Windows PowerShell 64 位命令行版
Windows PowerShell ISE 64 位图形脚本编辑器
Windows PowerShell (x86) 32 位命令行版
Windows PowerShell ISE (x86) 32 位图形脚本编辑器

⚠️ 注意:Windows 11 本身不支持 32 位系统,但仍包含 x86 的 PowerShell 版本以兼容旧程序。


启动 PowerShell 的方法

普通启动方式

单击 Windows PowerShell 快捷方式启动 PowerShell 控制台。

PowerShell 控制台的标题栏会显示 "Windows PowerShell"。

注意:某些命令在以普通用户身份运行 PowerShell 时可以正常运行,但 PowerShell 本身不参与用户访问控制(UAC),无法提示用户提升权限。

用户访问控制(UAC)说明

UAC 作用:Windows 安全功能,防止恶意代码以提升权限运行。

普通用户权限限制:当以普通用户身份运行时,尝试执行需要管理员权限的命令会报错。

例如停止 Windows 服务:

Stop-Service -Name W32Time

报错信息示例:

Stop-Service : Service 'Windows Time (W32Time)' cannot be stopped due to
the following error: Cannot open W32Time service on computer '.'.
At line:1 char:1
+ Stop-Service -Name W32Time
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (System.ServiceProcess.ServiceCon
   troller:ServiceController) [Stop-Service], ServiceCommandException
    + FullyQualifiedErrorId : CouldNotStopService,Microsoft.PowerShell.Comm
   ands.StopServiceCommand
解决方案:需要使用提升为本地管理员权限的用户运行 PowerShell。

配置了第二个域用户帐户,符合最小权限原则,不是域管理员且无域内提升权限。

操作步骤:

  • 右键点击 Windows PowerShell 快捷方式
  • 选择"以管理员身份运行"

系统提示:由于当前以普通用户登录,Windows 会提示输入本地管理员用户凭据。

确认提升:提升后的 PowerShell 窗口标题栏显示"管理员:Windows PowerShell"。

效果:在提升的 PowerShell 中运行需要管理员权限的命令,不再遇到 UAC 错误。

权限提升原则:只有在绝对必要时才应以管理员身份提升 PowerShell。

远程计算机:面向远程计算机时,无需提升 PowerShell 权限。提升权限只影响本地命令。

固定快捷方式:可将 PowerShell 或 Windows 终端快捷方式固定到任务栏,方便启动:

安全启动提升的 PowerShell:如果需要提升权限启动 PowerShell,可按住 Shift 键,同时右键点击任务栏上固定的 PowerShell 图标,选择"以管理员身份运行"


确定 PowerShell 版本及执行策略指南

一、查看 PowerShell 版本

PowerShell 提供自动变量 $PSVersionTable,包含当前 PowerShell 会话的版本和相关信息。

$PSVersionTable

输出结果类似如下:

Name                           Value
----                           -----
PSVersion                      5.1.22621.2428
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.22621.2428
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

版本说明

  • Windows PowerShell 5.1 预装于当前支持的 Windows 版本中,是推荐使用的版本。
  • PowerShell 7(跨平台版)并非 Windows PowerShell 5.1 的替代品,而是与之并行安装的不同产品。
  • PowerShell 6(也称 PowerShell Core)已不再受支持。

二、理解执行策略(Execution Policy)

执行策略是 PowerShell 的安全功能,用于控制脚本运行条件,防止无意执行恶意脚本。

注意:执行策略不是安全边界,熟练用户可绕过。

执行策略的作用范围

  • 可以针对本地计算机(LocalMachine)、当前用户(CurrentUser)或当前会话(Process)设置。
  • 也可通过组策略管理用户和计算机的执行策略。

常见 Windows 默认执行策略

操作系统版本 默认执行策略
Windows Server 2022 RemoteSigned
Windows Server 2019 RemoteSigned
Windows Server 2016 RemoteSigned
Windows 11 Restricted
Windows 10 Restricted

Restricted 表示默认不允许执行任何脚本。

三、查询当前执行策略

查询当前策略:

Get-ExecutionPolicy

输出结果类似如下:

Restricted 

列出所有范围的执行策略设置:

Get-ExecutionPolicy -List

输出类似如下:

Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

四、执行策略对脚本运行的影响示例

假设有脚本文件 Get-TimeService.ps1,直接在交互式命令行运行该命令正常:

Get-Service -Name W32Time

但是,从脚本中运行相同的命令时,PowerShell 将返回错误。

.\Get-TimeService.ps1

错误信息:

.\Get-TimeService.ps1 : File C:\tmp\Get-TimeService.ps1 cannot be loaded
because running scripts is disabled on this system. For more information,
see about_Execution_Policies at
https:/go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .\Get-TimeService.ps1
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

五、修改执行策略

1. 设置为 RemoteSigned(推荐)

允许运行本地脚本和受信任发布者签名的远程脚本。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  • 必须以管理员身份运行 PowerShell 才能更改本地计算机(LocalMachine)的执行策略。
  • 更改时会有确认提示:
Do you want to change the execution policy? [Y] Yes  [A] Yes to All  ...

2. 仅修改当前用户的执行策略(无需管理员权限)

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

六、常见错误提示及解决

未提升管理员权限修改 LocalMachine 策略时错误:

Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied.

解决方案:以管理员身份运行 PowerShell 后重试,或只修改当前用户策略。

七、修改后验证

执行策略修改为 RemoteSigned 后,运行脚本:

.\Get-TimeService.ps1

输出结果:

Status   Name    DisplayName
------   ----    -----------
Running  W32Time Windows Time

八、注意事项

  • 脚本是纯文本文件,扩展名为 .ps1
  • 推荐使用 Visual Studio Code 或文本编辑器编写脚本。
  • 在修改执行策略前,请阅读官方文档 about_Execution_Policies 了解相关安全风险。