2

我有一个有效的 PS 脚本,可以获取远程服务器的启动时间

#$ServerArray is the list of servers

$cso = New-CimSessionOption -Protocol Dcom
$cs = New-CimSession -ComputerName $ServerArray -SessionOption $cso
Get-CimInstance -CimSession $cs -ClassName win32_operatingsystem -OperationTimeoutSec 10 | select csname, Caption, lastbootuptime | sort lastbootuptime | format-table -autosize

结果:

csname         Caption                                   lastbootuptime
------         -------                                   --------------
server1        Microsoft Windows Server 2012 R2 Standard 10/30/2021 3:07:23 AM
server2        Microsoft Windows Server 2012 R2 Standard 10/30/2021 3:12:35 AM
server3        Microsoft Windows Server 2012 R2 Standard 10/30/2021 3:13:34 AM

是否可以使用 PowerShell 或其他 API 提取任何其他详细信息以显示服务器已正确启动?

4

1 回答 1

2

注意:根据执行机制的不同,这可能很难使用 PowerShell;PowerShell Remoting 在引导的早期阶段不可用,交互式 CLI 也不可用。但是,某些代理或服务(例如 VMware Tools)可以在这些时候促进远程执行。还可以利用计划任务在一些较早的启动阶段在本地运行代码。尽管此答案以 PowerShell 为中心,但一般信息也可以与其他编程语言一起使用。

有 Windows 的启动状态,您可以尝试寻找检查这些状态的方法,但我发现了解计算机是否处于用户登录状态的最可靠方法是等待Get-Process winlogon返回进程。一旦winlogon运行,计算机就接近或能够促进登录会话,等待 GPO 应用程序的完成。


超级用户回答说明了如何使用 Windows 性能工具包(Windows SDK 的一部分)来启动引导跟踪并传播其报告,但这不是此问题或答案的重点。我将它包含在这里是为了表明等待winlogon是识别系统何时准备好进行交互的正确方法;的执行winlogon实际上是最终的 Windows 启动阶段,这个答案就是例证。

注意:从技术上讲,登录并等待计划任务在登录时完成是最后一步,但该部分是在内核启动完成之后进行的,并且可以重复多个登录会话。我不考虑“引导顺序”或系统初始化的这一部分。

至于 Windows 的启动阶段,我只能使用xbootmgr. 我不确定是否有记录在案的 API(win32 或其他)暴露给用户空间来检查引导跟踪之外的当前引导阶段。目前我只能建议查看环境细节以了解当前的启动阶段(例如检查winlogon进程),尽管我对其他启动阶段的环境还不够熟悉,无法在此提出额外的建议。


如果我了解有关其他阶段的更多信息,我将更新此答案。

于 2021-10-31T00:03:10.967 回答