Windows 10启动时间和正常运行时间:PowerShell见解

Windows的正常运行时间是许多服务器管理员用来排除日常环境中可能出现的问题的一种度量标准。在本文中,您将学习如何在Windows 10和Windows Server中检查启动时间。您可以自由选择最简单的方法。将本文用作将来的参考。

本文将分为两个主要部分:检查服务器正常运行时间和查找历史Windows正常运行时间。第一部分将重点介绍如何查找自上次重启以来计算机已经运行了多长时间。在本文中,这称为“当前”正常运行时间。

本文的第二部分将重点介绍“历史”正常运行时间,即在多次重新启动之间Windows系统的运行时间。使用PowerShell,您将学习如何解析Windows事件日志以获取历史正常运行时间。

如何在Windows 10和Windows Server中检查启动时间

首先,让我们开始探讨一些不同的方法来查找当前的Windows正常运行时间。

通过本节,您将看到如何通过在Windows系统上本地运行命令来检查Windows 10的启动时间的演示。但是请注意,通过使用PowerShell远程连接,您也可以远程执行这些检查(不包括任务管理器)。

任务管理器

查找正常运行时间的最简单和直接的方法之一是简单地打开任务管理器。

要使用任务管理器检查Windows的正常运行时间,请右键单击Windows任务栏,然后选择任务管理器或按CtrlShiftEsc。一旦打开任务管理器,点击性能选项卡。在性能选项卡下,您将看到一个标签为正常运行时间的标签。

Finding Windows uptime with task manager

事件查看器

事件查看器是大多数系统管理员经常使用的工具,这使得它成为一种非命令行相关的检索正常运行时间的好选择。事件ID 6005和6006可用于识别事件日志服务启动或停止的时间,这些事件发生在启动/关闭期间。按照以下步骤通过事件查看器识别正常运行时间:

  • 打开开始菜单,简单搜索事件查看器,您也可以通过计算机管理进入它。
  • 在左侧,展开Windows日志部分并选择系统
  • 现在我们只查询与系统相关的事件,请点击窗口右侧的“过滤当前日志…”
  • 在事件ID字段中(默认情况下将预填有显示“所有事件ID”的文本),我们需要搜索我们适用的事件ID,键入“6005, 6006”,然后点击确定

然后您可以比较两个时间以创建总的正常运行时间。此外,由于许多这些事件的实例被存储,我们可以查询正常运行时间的历史记录!

现在,您已经过滤了事件日志,它将向您显示不仅是最后一次,而且所有已知的启动/关闭时间。

PowerShell

PowerShell有几种不同的方法可以获取正常运行时间。您可以查询WMI或使用Windows事件日志。

在查询WMI时,您可以查询Win32_OperatingSystem类并选择LastBootUpTime属性,如下所示。

PS51> Get-CimInstance Win32_OperatingSystem | Select-Object LastBootUpTime

LastBootUpTime      
--------------      
9/25/2019 9:37:37 PM

要通过PowerShell查询事件日志,请使用Get-WinEvent命令。您需要搜索事件ID 6005或6006,这些事件ID表示计算机上次启动的时间。

PS51> Get-WinEvent -ProviderName EventLog | Where-Object {$_.Id -eq 6005 -or $_.Id -eq 6006} | Select-Object -First 1 TimeCreated

TimeCreated         
-----------         
9/25/2019 9:37:52 PM

WMIC

WMIC提供了用于WMI的命令行界面,是一个经过多年验证的可靠方法。要通过WMIC查询正常运行时间,您再次查询Win32_OperatingSystem WMI类,尽管有点隐蔽。您可以看到下面您可以使用WMIC语法os get lastbootuptime返回服务器上次启动的时间。

> wmic os get lastbootuptime

LastBootUpTime             

20190925213737.500000-240

您无需下载任何内容即可利用WMIC,因为它已经与Windows预装。

系统信息实用程序

systeminfo命令显示有关计算机的详细配置信息,可用于查询系统正常运行时间。通过使用内置的find命令行工具,您可以解析文本以检索所需的数据。

只需打开命令提示符或PowerShell,然后键入systeminfo | find

> systeminfo | find "System Boot Time:"

System Boot Time:          9/25/2019, 9:37:37 PM

您无需下载任何东西来利用systeminfo,因为它已预装在Windows中。

网络统计命令

您还可以通过Net Statistics或更常用的net stats快速查询正常运行时间。net stats命令返回有关您会话的一般信息。您可以在下面看到统计信息自…行。该日期表示计算机启动的时间。

> net stats srv

Workstation Statistics for \\NATES-PC


Statistics since 9/25/2019 9:37:52 PM

--SNIP--

The command completed successfully.

正常运行时间命令

如果您需要一个小型、便携的工具来查找Windows的正常运行时间,那么NeoSmart Technologies的Windows正常运行时间命令是您的不二之选。该实用工具非常适合快速查询任何Windows版本的正常运行时间。该工具的主要优点是便利性。如果您发现自己每天使用多次,您可能会考虑使用这种方法。

下载该工具后,将uptime.exe提取到%WinDir%\System32。然后打开命令提示符,只需键入uptime即可。

Uptime tool

要远程运行此工具,您首先需要将该工具复制到要检查正常运行时间的Windows系统中。

介绍Get-ServerUptimeReport脚本

因此,您无需自己编写PowerShell,只需下载一个名为Get-ServerUptimeReport.ps1的社区脚本。

PS51> Install-Script -Name Get-ServerUptimeReport

这个脚本允许你提供一个计算机名作为参数。然后,它会解析计算机的系统事件日志,并找到开始和停止事件以进行比较。然后,它将返回服务器在线时间的总计,直到事件日志滚动。

下面是在服务器上使用此脚本的示例。它将返回事件日志中服务器的所有事件的总正常运行时间,包括当前的正常运行时间。

PS51> ./Get-ServerUptimeReport.ps1 -ComputerName sqlsrv1

Startup Shutdown Uptime (Days) Uptime (Min)
------- -------- ------------- ------------
9/16/2017 12:40:00 PM 9/22/2017 4:20:11 PM 6.15 8860.18
9/16/2017 10:22:49 AM 9/16/2017 12:22:36 PM 0.08 119.79
9/16/2017 3:22:12 PM 9/22/2017 4:20:11 PM 6.04 8697.98

跨多个服务器查找Windows正常运行时间

此脚本是查找单个服务器多天正常运行时间的快速方法。但是,如果您需要一次为多个服务器获取此信息怎么办?为此,您可以收集服务器列表,然后逐个将每台计算机的名称传递给此脚本。

例如,在PowerShell控制台中定义所有服务器为一个数组。在此示例中,变量数组将被称为$servers

实际上,您可能会从Active Directory、Hyper-V或文本文件中提取服务器名称。只要您可以构建一个服务器名称数组,就没问题。

定义所有服务器名称,然后使用循环对每个服务器进行迭代,如下所示。

$servers = 'WEBSRV1','SQLSRV1'
foreach ($server in $servers) {
	Get-ServerUptimeReport.ps1 -ComputerName $server
}

Startup Shutdown Uptime (Days) Uptime (Min)
------- -------- ------------- ------------
9/16/2017 12:45:48 PM 9/22/2017 4:25:39 PM 6.15 8859.86
9/16/2017 10:42:52 AM 9/16/2017 12:42:34 PM 0.08 119.7
9/16/2017 2:42:17 PM 9/22/2017 4:25:39 PM 6.07 8743.38
9/16/2017 12:40:00 PM 9/22/2017 4:25:39 PM 6.16 8865.65
9/16/2017 10:22:49 AM 9/16/2017 12:22:36 PM 0.08 119.79
9/16/2017 3:22:12 PM 9/22/2017 4:25:39 PM 6.04 8703.46

此代码有效,但是无法确定每行引用的是哪台服务器。使用计算属性如下添加服务器名称到输出中。

$servers = 'WEBSRV1','SQLSRV1'
foreach ($server in $servers) {
	Get-ServerUptimeReport.ps1 -ComputerName $server | Select-Object -Property *,@{n='ServerName';e={$server}}
}

Startup Shutdown Uptime (Days) Uptime (Min) ServerName
------- -------- ------------- ------------ ----------
9/16/2017 12:45:48 PM 9/22/2017 4:34:59 PM 6.16 8869.19 WEBSRV1
9/16/2017 10:42:52 AM 9/16/2017 12:42:34 PM 0.08 119.7 WEBSRV1
9/16/2017 2:42:17 PM 9/22/2017 4:34:59 PM 6.08 8752.71 WEBSRV1

Startup Shutdown Uptime (Days) Uptime (Min) ServerName
------- -------- ------------- ------------ ----------
9/16/2017 12:40:00 PM 9/22/2017 4:35:01 PM 6.16 8875.01 SQLSRV1
9/16/2017 10:22:49 AM 9/16/2017 12:22:36 PM 0.08 119.79 SQLSRV1
9/16/2017 3:22:12 PM 9/22/2017 4:35:01 PM 6.05 8712.81 SQLSRV1

现在,我们有了一个很棒的小工具,可以为我们提供服务器随时间的正常运行时间快速报告!

总结

你现在已经看到了许多不同的查找 Windows 运行时间的方法。无论你选择哪个选项,你都会收到相同的信息。为你自己的上下文选择最佳方法。

而且请记住,如果你需要一份关于运行时间历史的报告,不要忘记使用 Get-ServerUptimeReport PowerShell 脚本!

Source:
https://adamtheautomator.com/windows-uptime/