如何确定服务器的正常运行时间?

问:

您好,脚本专家! 如何确定服务器的正常运行时间?

-- LF

答:

您好,LF。 这个问题很简单。 毕竟,我们假设您谈论的是 Windows 服务器,而 Windows 服务器是永远不停机的,对吗? 因此,正常运行时间肯定是无限长的。 问题得到了解决。

那么,我们假设 Windows 服务器停机(可能是因为某个非 Windows 用户偷偷潜入并将电源插头或其他什么东西拔掉了)。 如果您想知道运行 Windows XP 或 Windows Server 2003 的计算机的系统正常运行时间,可使用以下脚本:

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * From Win32_PerfFormattedData_PerfOS_System")
 
For Each objOS in colOperatingSystems
    intSystemUptime = Int(objOS.SystemUpTime / 60)
    Wscript.Echo intSystemUptime & " minutes"
Next

正如您所看到的,我们连接至 WMI 服务,然后使用 ExecQuery 方法来检索 Win32_PerfFormattedData_PerfOS_System 类中的所有实例。 (顺便提一下,这解释了该脚本只能在 Windows XP 或 Windows Server 2003 上运行的原因: 只有 Windows 的这两个版本中含有 Win32_PerfFormattedData_PerfOS_System 类。)

Win32_PerfFormattedData_PerfOS_System 包含许多与操作系统相关的性能计数器,其中包括 SystemUpTime,其可指示您机器已经运行了多长时间(以秒计)。 我们使用下面这行代码来获取 SystemUpTime 的值,并将其除以 60(这样显示的正常运行时间的单位为分钟,而不是秒),然后再将其转换为整数,除去小数点后的所有数字:

intSystemUptime = Int(objOS.SystemUpTime / 60)

是的,那正是一小行代码所要做的,简直太多了,不是吗? 然后我们回显变量 intSystemUptime 的值就可以了。

好了,除非您运行的是 Windows 2000,否则问题就解决了。 正如前面所述,上述脚本不能在 Windows 2000 上运行,Windows 2000 甚至从没听说过 Win32_PerfFormattedData_PerfOS_System 类。 幸运的是,存在一种解决方法;虽然有些笨拙,但毕竟也是一种解决方法:

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
 
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime
    dtmLastBootupTime = WMIDateStringToDate(dtmBootup)
    dtmSystemUptime = DateDiff("n", dtmLastBootUpTime, Now)
    Wscript.Echo dtmSystemUptime & " minutes"
Next
 
Function WMIDateStringToDate(dtmBootup)
    WMIDateStringToDate = CDate(Mid(dtmBootup, 5, 2) & "/" & _
        Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) _
            & " " & Mid (dtmBootup, 9, 2) & ":" & _
                Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup,13, 2))
End Function

在此脚本中,我们连接至 WMI 服务,然后查询 Win32_OperatingSystem 类;那是因为 Win32_OperatingSystem 中包含一个属性 – LastBootUpTime – 该属性可告诉您计算机上次启动的时间。 这一点非常有用: 如果我们从当前时间中减去 LastBootUpTime,我们就会知道 – 没错 – 计算机已经运行了多长时间。

唯一棘手的部分是,与所有 WMI 日期和时间一样,LastBootUpTime 是以 UTC(通用时间坐标)格式存储的。 那就意味着将返回下面这样的值:

20050726071152.500000-420

在进行尝试之前,请不要费神从当前日期和时间中减去该值;那样做是徒劳的。 我们需要将该值转换成看起来更像实际日期和时间的形式;这正是我们之所以调用一个由我们编写的函数的原因,该函数可将 UTC datetime 值转换成常规的老式日期/时间值:

dtmLastBootupTime = WMIDateStringToDate(dtmBootup)

注意。 我们将不对该函数的工作方式进行介绍。 如果您对此感兴趣,请参阅 Microsoft Windows 2000 Scripting Guide(英文)中的此部分

转换完成后,我们通过 DateDiff 函数从当前时间中减去上次启动时间:

dtmSystemUptime = DateDiff("n", dtmLastBootUpTime, Now)

正如您所看到的,我们将三个参数传递给 DateDiff:

“n”,表示以分钟为单位报告时间差。

dtmLastBootUpTime,用来存储转换后的 datetime 值的变量。

Now,当前日期和时间。

我们接下来要做的就是以分钟为单位回显系统正常运行时间。

正如前面所述,我们无法想象您为何需要对 Windows 计算机使用这样一个脚本,而只是以防万一…。

你可能感兴趣的:(windows,Microsoft,脚本,XP)