我有一个工作的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提取,以显示服务器已正确启动?
备注:根据执行机制的不同,这可能很难使用PowerShell;PowerShell Remoting在引导的早期阶段不可用,交互式CLI也不可用。然而,一些代理或服务(例如VMware Tools)可以在这种情况下促进远程执行。还可以利用计划任务在一些较早的引导阶段在本地运行代码。虽然这个答案是围绕PowerShell的,但一般信息也可以用于其他编程语言。
有Windows的启动状态,你可以尝试寻找方法来检查这些,但我发现知道计算机是否处于用户登录的状态的最可靠的方法是等待Get-Process winlogon
返回一个进程。一旦winlogon
运行,计算机就接近或能够促进登录会话,等待GPO应用程序的完成。
这个超级用户的回答解释了如何使用Windows性能工具包(Windows SDK的一部分)来启动引导跟踪并传播其报告,但这不是这个问题或答案的重点。我在这里包含它是为了表明等待winlogon
是识别系统何时准备好进行交互的正确方法;winlogon
的执行实际上是Windows启动的最后阶段,这个答案说明了这一点。
注意:从技术上讲,登录并等待计划任务在登录时完成是最后一步,但这部分是在内核引导完成之后进行的,并且可以在多个登录会话中重复。我不认为这是"引导序列"的一部分。或系统初始化。
对于Windows的启动阶段,我只能使用xbootmgr
生成启动跟踪的报告。我不确定是否有文档化的API (win32或其他)公开给用户空间,以检查引导跟踪之外的当前引导阶段。此时,我只能建议查看环境细节以了解当前启动阶段(例如检查winlogon
进程),尽管我对其他启动阶段的环境不够熟悉,因此无法在这里提出额外的建议。
如果我了解更多关于其他阶段的信息,我会更新这个答案。