当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用PowerShell重启计算机的有效方法

作者:精品下载站 日期:2024-12-14 13:02:45 浏览:14 分类:玩电脑

使用PowerShell重启计算机的有效方法


系统管理员不可避免地需要重新启动服务器或系统。为什么不使用 PowerShell 重新启动计算机(或许多计算机!),而不是单步执行用户界面?

[玩转系统] 使用PowerShell重启计算机的有效方法

在本文中,您将学习使用 PowerShell 管理计算机重新启动的所有方法。我们将比仅仅使用 Restart-Computer cmdlet 更深入。

我们走吧!

先决条件

本教程将引导您了解使用 PowerShell 重新启动计算机的各种方法。如果您打算继续操作,请确保您具备以下条件:

  • 本地管理员组中任何计算机(本地或远程)上的用户帐户
  • Windows PowerShell 或 PowerShell Core。本教程将使用 Windows PowerShell 5.1。
  • WinRM 已配置并允许通过远程计算机的 Windows 防火墙,并且允许 WMI 通过 Windows 防火墙

使用 PowerShell 通过 Restart-Computer 重新启动计算机

第一个 PowerShell 特定方法(也是最常见的)是 PowerShell Restart-Computer cmdlet。该 cmdlet 使用简单,参数灵活,其中一些参数使脚本集成变得非常容易。

正如您在下面的示例中看到的,这通常是大多数 PowerShell 脚本最直接的方法和首选解决方案。

下面的简单示例连接到名为 SRV1 的远程计算机。要跳过默认确认,它使用 Force 参数重新启动计算机。

Restart-Computer -ComputerName SRV1 -Force

Restart-Computer cmdlet 有几个参数来配置命令如何与计算机交互,如下所示。

  • ComputerName - 您打算重新启动的系统。此参数可以采用以下远程地址、NetBIOS、IP 地址或完全限定域名 (FQDN)。对于本地系统,请使用 .localhost 或省略该参数。
  • 强制 - 如果系统上当前有其他用户,则使用。这将强制关闭。
  • Wait - 此参数将无限期地阻止提示和管道(除非与超时参数配对)。它与 For 参数结合使用,以轮询特定组件是否可用。
  • Timeout - 与 Wait 参数一起使用,这将确保出现问题时重新启动不会无限期地阻止提示和管道。
  • For - PowerShell 可以查找一些组件来指示重新启动成功。默认情况下,Restart-Computer 会查看 PowerShell 本身是否正在运行以指示重新启动操作成功。另一种选择是等待 WMI 或 WinRM 可用。
  • Delay - 默认情况下,cmdlet 将每隔 5 秒轮询一次以检查定义的组件,同时等待远程系统变得可用。该参数将覆盖默认的延迟时间段。

ComputerName 参数不使用 WinRM 进行远程系统调用,因此,您无需担心本地系统是否配置为 WinRM。

使用 PowerShell 通过 Invoke-CimMethod 重新启动计算机

Invoke-CimMethod 并非专门用于远程重新启动系统,它通过使用 WIM 方法来重新启动远程系统。不像 Restart-Computer cmdlet 那样灵活,您可以使用 PowerShell 使用本机命令远程重新启动计算机。

确保 WinRM 已配置并允许通过此方法的远程计算机的 Windows 防火墙。

Invoke-CimMethod -ComputerName SRV1 -ClassName 'Win32_OperatingSystem' -MethodName 'Reboot'

Invoke-CimMethod 有一些您应该注意的参数。

  • ClassName - 要使用的 CIM 类的名称。对于重新启动命令,我们使用 Win32_OperatingSystem 类。
  • ComputerName - 使用 WsMan 协议,您可以使用以下任意远程地址类型:NetBIOS、IP 地址或完全限定域名 (FQDN)。如果省略该参数,则使用 COM 执行本地操作。
  • MethodName - 方法名称是目标类的 WMI 方法。在重新启动操作的情况下,您将需要使用Reboot方法。

使用 PowerShell 通过运行 shutdown.exe 远程重新启动计算机

从特定于 PowerShell 的 cmdlet 开始,我们来到 Windows 提供的用于重新启动系统的标准内置可执行文件。 shutdown.exe 可执行文件已经存在很长时间了,并提供了一系列强大的选项。

虽然从技术上讲不是 PowerShell cmdlet,但您仍然可以使用 PowerShell 通过作为可执行文件调用来重新启动带有 shutdown.exe 的计算机。

确保远程计算机启用了远程注册表服务,并且允许 WMI 通过此方法的 Windows 防火墙。

shutdown.exe /m \remotecomputer /r /t 0

以下是您应该了解的关闭命令的参数。

  • r - 首次关闭系统后重新启动计算机。
  • g - 这与 r 命令类似,但也会在启动时重新启动所有已注册的应用程序。 Windows Vista 中引入的 Windows 重新启动管理器允许正常关闭和重新启动在此系统中注册的应用程序。一个例子是 Outlook 应用程序,如果它在关闭时最初打开,它会自动启动备份。
  • e - 记录系统意外重启的原因。
  • m - 要重新启动的远程系统,采用 \computername 参数。
  • t - 启动重新启动操作之前的时间(以秒为单位)。如果定义的值大于0,则隐含f(强制)参数。默认值为30秒,但不强制。
  • c - 可选的重新启动消息,将在关闭前显示在屏幕上以及 Windows 事件日志注释中,最多可包含 512 个字符。
  • f - 强制关闭所有正在运行的应用程序,这不会在任何应用程序中提示“文件→保存”提示,并可能导致数据丢失。
  • d - 重新启动操作的原因代码列表。此类原因代码的示例是 P:2:18,它对应于操作系统:安全修复(计划)。

使用 PowerShell 通过 PSExec.exe 重新启动计算机

使用 PowerShell 重新启动计算机是通过 Sysinternals 工具包中最常用的实用程序之一,psexec.exe提供了多种独特的功能,使与远程系统的交互变得容易。 psexec.exe 采用与 PowerShell 和内置实用程序不同的方法,在远程系统上创建一个服务,然后通过该服务代理命令。

确保 SMB 服务正在运行,文件和打印机共享已启用,简单文件共享已禁用,并且 admin$管理共享可用于此方法。

psexec.exe -d -h \remotecomputer "shutdown.exe /r /t 0 /f"
  • d - 以非交互方式使用 psexec,无需等待进程终止,这在脚本中很有用。
  • h - 如果目标系统是 Vista 或更高版本,请使用帐户的提升令牌(如果可用)运行此过程。
  • n - 指定连接到远程计算机时的超时(以秒为单位)。
  • s - 使用系统帐户运行进程,这比典型的管理帐户授予更高级别的访问权限。这并不总是需要或使用,但却是一种非常有用的能力。
  • computer - 采用 \remotecomputer 形式的位置参数,允许对远程系统使用 psexec
  • cmd - 另一个位置参数,用于指定针对系统运行的实际命令。由于 psexec 本身不会重新启动系统,因此该命令将是另一个实用程序,例如用于重新启动系统的 shutdown.exe。
  • arguments - 此位置参数包含需要传递给先前定义的 cmd 的任何参数。
  • accepteula - 如果 psexec 未记录您已接受 EULA,该工具通常会在屏幕上显示接受 EULA 的提示。这将接受 EULA,而无需图形提示。
  • nobanner - 连接到远程系统时,该工具会显示横幅信息,nobanner 将抑制该信息。

奖金方法!

下面显示的方法不是很常用,但根据需要可能很有用。

运行DLL32.exe

rundll32.exe 提供了一种针对内部可执行文件和 Windows API(例如 shell32.dll)运行某些方法的方法。您可以通过两种方法使用此功能重新启动系统。

  • rundll32.exe user.exe ExitWindowsExec - 重新启动本地系统。
  • rundll32.exe shell32.dll,SHExitWindowsEx 2 - 还将重新启动本地系统。

此方法本身无法实际远程使用,但您可以通过远程系统上的 Invoke-Command 将此方法与 PowerShell 结合使用。

# Method 1
Invoke-Command -ComputerName $ComputerName -ScriptBlock { & rundll32.exe user.exe ExitWindowsExec }

# Method 2
Invoke-Command -ComputerName $ComputerName -ScriptBlock { & rundll32.exe shell32.dll,SHExitWindowsEx 2 }

任务终止程序

最后,taskkill.exe 是另一个 Windows 实用程序,它提供了一些重新启动计算机的功能,尽管是以一种迂回的方式。通过结束 lsass.exe 进程,您将强制 Windows 重新启动。

taskkill.exe /S \remotecomputer /IM lsass.exe /F

使用PowerShell重启计算机(多系统并行)

大多数系统管理员都需要在某一时刻重新启动多个系统。让我们快速浏览一下如何将这些命令结合在一起来完成此操作。

使用 PowerShell 7 和 Restart-Computer 命令可以轻松并行地重新启动计算机。

$ComputerArray | ForEach-Object -Parallel {
    Restart-Computer -ComputerName $_ -Force
} -ThrottleLimit 3

正如您可以通过较新的 ForEach-Object -Parallel 功能看出的,在命令中添加并行化非常简单。由于 Restart-ComputerForEach-Object 结合使用,本身就支持远程重启,因此可以快速轻松地管理和重启大型系统!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯