重启 Windows 计算机很简单,对吧?大家都知道,点几下鼠标就可以轻松完成 Windows 系统重启。但这种重启方式只对家庭用户和管理少量 PC 的用户适用,如果需要在工作中重启数人百计的客户端和服务器呢?这么大批量的 Windows 重启操作就不是那么简单了。
最近笔者就遇到一个要批量重启 2300 多台 Windows Server 的艰巨任务,这批服务器全为 DELL 刀片,要求 5 天内完成全部重启,是根本不可能去一台台手动重启的。
对熟悉 PowerShell 的管理员来说,肯定首先想到 Restart-Computer cmdlet。Restart-Computer 是许多 IT Pro 用来重启本地和远程计算机的常见命令,毕竟可以在 ComputerName 参数中指定尽可能多的计算机(名)来批量重新启动 Windows 计算机。
问题就这么解决了?似乎没这么简单。
其中一个潜在的问题就是 Restart-Computer 不能自动工作,远程计算机本身必须满足某些先决条件才能实现重启。例如:远程计算机必需使用 DCOM 或 WSMAN 进行身份验证。
默认情况下,Restart-Computer 使用 DCOM。所有要重启的远程计算机要先确认是否启用了 DCOM 或 PowerShell Remoting,这样 Restart-Computer 才可以以 WsManAuthentication 和 DcomAuthentication 参数的形式提供一些选项。通过使用这些参数,可以指定连接到每台远程计算机的方式。
Restart-Computer -ComputerName SRV1 -WsmanAuthentication {Default | Basic | Negotiate | CredSSP | Digest | Kerberos} Restart-Computer -ComputerName SRV1 -DcomAuthentication {Default | None | Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged }
如果确定好了连接方式,那么 Restart-Computer -ComputerName 后跟定的计算机名将按顺序重启。例如:computer 1、computer 2、computer 3 等等。
当然,2300 台服务器是不可能一次性就重启的。如果我们计划好每次重启 100 台,分 24 次就可以将 2300 余台服务器全部重启。而且就算每次只重启 100 台 Windows Server,也是需要一段时间的。由于 Restart-Computer 的每次重启任务都是独立的,而每台服务器重启都需要时间,管理员是否需要等待每一个重启任务完成呢?当然不是!Restart-Computer 有一个 AsJob 参数,可以使用 AsJob 参数来创建一个后台作业,让批量重启任务在后台下发,而不必停下等待每台服务器重启完成。(使用后台任务,比一次又一次执行重启任务要快得多。)
Restart-Computer -ComputerName SRV1,SRV2,SRV3,SRV4 -AsJob
重启命令批量分发下去之后还没完,我们还需要确定重启的 Windows Server 是否被正常唤醒。为了确认远程主机是否已经正常启动,我们还可以使用 Wait 参数和 For 参数。Wait 和 For 参数非常适合在脚本中使用,可以在远程计算机恢复后执行其他任务。
Restart-Computer -ComputerName SRV1 -For {Wmi | WinRM | PowerShell}
Restart-Computer cmdlet 在许多不同的场景中非常有用,通过它提供的参数不仅可批量远程重启 Windows 计算机,还可以执行重启后的规定任务。