第 1 章 - PowerShell 入门

本章重点介绍查找和启动 PowerShell 并解决新用户使用 PowerShell 遇到的初始难题。 请继续操作并演练本章中有关实验室环境计算机的示例。

什么是 PowerShell?

Windows PowerShell 是一种易于使用的命令行 shell 和脚本环境,用于自动执行基于 Windows 的系统的管理任务。 Windows PowerShell 预安装在 Windows 操作系统的所有新式版本上。

在何处查找 PowerShell

在 Windows 11 上查找 PowerShell 的最简单方法是键入 PowerShell 搜索栏,如图 1-1 所示。 请注意,Windows PowerShell 有四种不同的快捷方式。

图 1-1 - 搜索 PowerShell。

64 位版本的 Windows PowerShell 快捷方式:

  • Windows PowerShell
  • Windows PowerShell ISE
  • Windows PowerShell (x86)
  • Windows PowerShell ISE (x86)

在 64 位版本的 Windows 上,有一个 64 位版本的 Windows PowerShell 控制台和 Windows PowerShell 集成脚本环境(ISE)和一个 32 位版本的每个版本,如快捷方式上的 (x86) 后缀指示。

注意

Windows 11 仅作为 64 位操作系统提供。 没有 32 位版本的 Windows 11。 但是,Windows 11 包括 32 位版本的 Windows PowerShell 和 Windows PowerShell ISE。

如果运行的是较旧的 32 位版本的 Windows,则只有两个快捷方式。 这些快捷方式没有 (x86) 后缀,而是 32 位版本。

如果你运行的是 64 位操作系统,则建议使用 64 位版本的 Windows PowerShell,除非有使用 32 位版本的特定原因。

根据正在运行的 Windows 11 版本,Windows PowerShell 可能会在Windows 终端打开。

Microsoft不再更新 PowerShell ISE。 ISE 仅适用于 Windows PowerShell 5.1。 具有 PowerShell 扩展Visual Studio Code (VS Code)适用于两个版本的 PowerShell。 VS Code 和 PowerShell 扩展不在 Windows 中提供。 在创建 PowerShell 脚本的计算机上安装 VS Code 和扩展。 无需在运行 PowerShell 的所有计算机上安装它们。

如何启动 PowerShell

我在支持的生产环境中使用三个不同的 Active Directory 用户帐户。 我在这本书中使用的实验室环境中镜像了这些帐户。 我以没有域或本地管理员权限的域用户身份登录到 Windows 11 计算机。

单击 Windows PowerShell 快捷方式启动 PowerShell 控制台,如图 1-1 所示。 请注意,控制台的标题栏显示 Windows PowerShell,如图 1-2 所示。

图 1-2 - PowerShell 窗口的标题栏。

某些命令在以普通用户身份运行 PowerShell 时运行正常。 但是,PowerShell 不参与用户访问控制(UAC)。 这意味着它无法提示用户对需要管理员批准的任务进行提升。

注意

UAC 是一项 Windows 安全功能,可帮助防止恶意代码使用提升的权限运行。

以普通用户身份登录时,当你运行需要提升的命令时,PowerShell 将返回错误。 例如,停止 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。 这就是我配置第二个域用户帐户的方式。 遵循最低权限原则,此帐户不应是域管理员,也不应在域中拥有任何提升的权限。

若要使用提升的权限启动 PowerShell,请右键单击 Windows PowerShell 快捷方式并选择“以管理员身份运行”,如图 1-3 所示。

图 1-3 - 上下文菜单 - 以管理员身份运行。

Windows 会提示输入凭据,因为你以普通用户身份登录到 Windows。 输入作为本地管理员的域用户的凭据,如图 1-4 所示。

图 1-4 - 用户帐户控制 - 输入凭据。

请注意,提升的控制台窗口的标题栏显示 管理员:Windows PowerShell,如图 1-5 所示。

图 1-5 - 提升的 PowerShell 窗口的标题栏。

在以管理员身份提升 PowerShell 后,运行需要提升的命令时,UAC 不再是问题。

重要

仅当绝对必要时,才应以管理员身份提升 PowerShell。

面向远程计算机时,无需运行提升的 PowerShell。 运行提升的 PowerShell 只会影响针对本地计算机运行的命令。

可以简化查找和启动 PowerShell。 将 PowerShell 或Windows 终端快捷方式固定到任务栏。 再次搜索 PowerShell,但这次右键单击它并选择“ 固定到任务栏 ”,如图 1-6 所示。

图 1-6 - 上下文菜单 - 固定到任务栏。

重要

本书的原始版本于 2017 年发布,建议每次启动 PowerShell 时,将快捷方式固定到任务栏以自动启动提升的实例。 但是,由于潜在的安全问题,我不再推荐它。 从 PowerShell 提升的实例启动的任何应用程序也会绕过 UAC 并运行提升的应用程序。 例如,如果从 PowerShell 的提升实例启动 Web 浏览器,则访问包含恶意代码的任何网站也会运行提升。

如果需要使用提升的权限运行 PowerShell,请在按 Shift 的同时右键单击固定到任务栏的 PowerShell 快捷方式。 选择“ 以管理员身份运行”,如图 1-7 所示。

图 1-7 - 上下文菜单 - 以管理员身份运行。

确定 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

如果运行的是低于 5.1 的 Windows PowerShell 版本,则应更新 Windows 版本。 Windows PowerShell 5.1 预安装在当前支持的 Windows 版本上。

PowerShell 版本 7 不是 Windows PowerShell 5.1 的替代项;它与 Windows PowerShell 并行安装。 Windows PowerShell 版本 5.1 和 PowerShell 版本 7 是两种不同的产品。 有关 Windows PowerShell 版本 5.1 和 PowerShell 版本 7 之间的差异的详细信息,请参阅 从 Windows PowerShell 5.1 迁移到 PowerShell 7

提示

不再支持 PowerShell 版本 6(以前称为 PowerShell Core)。

执行策略

PowerShell 执行策略控制运行 PowerShell 脚本的条件。 PowerShell 中的执行策略是一项安全功能,旨在帮助防止无意中执行恶意脚本。 但是,这不是安全边界,因为它无法阻止确定的用户故意运行脚本。 确定的用户可以绕过 PowerShell 中的执行策略。

可以为本地计算机、当前用户或 PowerShell 会话设置执行策略。 还可以为具有组策略的用户和计算机设置执行策略。

下表显示了当前 Windows 操作系统的默认执行策略。

Windows 操作系统版本 默认执行策略
Windows Server 2022 远程签名
Windows Server 2019 远程签名
Windows Server 2016 远程签名
Windows 11 受限
Windows 10 受限

无论执行策略设置如何,都可以以交互方式运行任何 PowerShell 命令。 执行策略仅影响脚本中运行的命令。 使用 Get-ExecutionPolicy cmdlet 确定当前的执行策略设置。

检查计算机上的执行策略设置。

Get-ExecutionPolicy
Restricted

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

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

所有 Windows 客户端操作系统都具有默认的执行策略设置 Restricted。 无法使用执行策略设置运行 PowerShell 脚本 Restricted 。 若要测试执行策略,请将以下代码保存为名为 <a0.ps1/> 的文件。

提示

PowerShell 脚本是一个纯文本文件,其中包含要运行的命令。 PowerShell 脚本文件使用 .ps1 文件扩展名。 若要创建 PowerShell 脚本,请使用代码编辑器(如 Visual Studio Code(VS Code)或任何文本编辑器(如记事本)。

以交互方式运行以下命令时,它将完成且不会出现错误。

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

在 PowerShell 中运行生成错误的命令时,请在重试该命令之前读取错误消息。 请注意错误消息告知命令失败的原因:

...在此系统上禁用正在运行的脚本。

若要启用脚本的执行,请使用 cmdlet 更改执行策略 Set-ExecutionPolicyLocalMachine 如果未指定 Scope 参数, 则为默认范围 。 必须以管理员身份运行 PowerShell 才能更改本地计算机的执行策略。 除非对脚本进行签名,否则建议使用 RemoteSigned 执行策略。 RemoteSigned 阻止运行未由受信任的发布者签名的已下载脚本。

更改执行策略之前,请阅读 about_Execution_Policies 帮助文章以了解安全隐患。

将计算机上的执行策略设置更改为 RemoteSigned

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

如果已成功更改执行策略,PowerShell 会显示以下警告:

Execution Policy Change
The execution policy helps protect you from scripts that you do not trust.
Changing the execution policy might expose you to the security risks
described in the about_Execution_Policies help topic at
https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the
execution policy?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "N"):y

如果未以管理员身份提升 PowerShell,PowerShell 将返回以下错误消息:

Set-ExecutionPolicy : Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWAR
E\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied. To
change the execution policy for the default (LocalMachine) scope, start
Windows PowerShell with the "Run as administrator" option. To change the
execution policy for the current user, run "Set-ExecutionPolicy -Scope
CurrentUser".
At line:1 char:1
+ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy],
   UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.
   PowerShell.Commands.SetExecutionPolicyCommand

还可以更改当前用户的执行策略,而无需以管理员身份运行提升的 PowerShell。 如果成功将本地计算机的 RemoteSigned执行策略设置为 ,则不需要执行此步骤。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

将执行策略设置为 RemoteSigned后, Get-TimeService.ps1 脚本将成功运行。

.\Get-TimeService.ps1
Status   Name               DisplayName
------   ----               -----------
Running  W32Time            Windows Time

总结

在本章中,你了解了在何处查找以及如何启动 PowerShell。 你还了解了如何确定 PowerShell 的版本和执行策略的目的。

审阅

  1. 如何确定计算机正在运行的 PowerShell 版本?
  2. 何时应以管理员身份启动 PowerShell 提升?
  3. Windows 客户端计算机上的默认执行策略是什么,它阻止你执行什么操作?
  4. 如何确定当前的 PowerShell 执行策略设置?
  5. 如何更改 PowerShell 执行策略?

参考

若要详细了解本章中介绍的概念,请阅读以下 PowerShell 帮助文章。

后续步骤

在下一章中,你将了解 PowerShell 中命令的可发现性。 你还将了解如何下载 PowerShell 的帮助文件,以便你可以在 PowerShell 会话中查看帮助。