分类: 系统运维
2013-12-16 10:20:05
最近,我需要找到远程网络上的多个Windows服务器的时间,并比较这些,我写了一个快捷功能,使用WMI来拉这个信息,并返回它在一个DateTime对象格式:
function Get-Time { <# .SYNOPSIS Gets the time of a windows server .DESCRIPTION Uses WMI to get the time of a remote server .PARAMETER ServerName The Server to get the date and time from .EXAMPLE PS C:\> Get-Time localhost .EXAMPLE PS C:\> Get-Time server01.domain.local -Credential (Get-Credential) #> [CmdletBinding()] param( [Parameter(Position=0, Mandatory=$true)] [ValidateNotNullOrEmpty()] [System.String] $ServerName, $Credential ) try { If ($Credential) { $DT = Get-WmiObject -Class Win32_LocalTime -ComputerName $servername -Credential $Credential } Else { $DT = Get-WmiObject -Class Win32_LocalTime -ComputerName $servername } } catch { throw } $Times = New-Object PSObject -Property @{ ServerName = $DT.__Server DateTime = (Get-Date -Day $DT.Day -Month $DT.Month -Year $DT.Year -Minute $DT.Minute -Hour $DT.Hour -Second $DT.Second) } $Times } #Example of using this function $Servers = "localhost", "dc01.domain.local" $Servers | Foreach { Get-Time $_ }
We can also use this function to easily check for time skew between two machines, the below code is an example where I check my time between a remote host and the local server to see if it is within 30 seconds…
$RemoteServerTime = Get-Time -ServerName "dc01.domain.local" $LocalServerTime = Get-Time -ServerName "localhost" $Skew = $LocalServerTime.DateTime - $RemoteServerTime.DateTime # Check if the time is over 30 seconds If (($Skew.TotalSeconds -gt 30) -or ($Skew.TotalSeconds -lt -30)){ Write-Host "Time is not within 30 seconds" } Else { Write-Host "Time checked ok" }