Summary: Microsoft Scripting Guy, Ed Wilson, shows how to use Windows PowerShell to easily compare the time between two computers.

Microsoft Scripting Guy, Ed Wilson, is here. In two days, I will be speaking to the AZPOSH Windows PowerShell user group in Phoenix, Arizona. No, I am not flying out there—I have enough travel coming up. Instead, I am speaking via Lync. Lync does an excellent job, and it is just about like being there in person (except for missing all the great restaurants they have out there). I will be speaking about using the Windows PowerShell 3.0 remoting capabilities for management purposes. It will be a lot of fun. If you cannot be there in person (such as myself), you may want to dial in to the Lync meeting.

Checking local and remote time

One of the people who was at the Windows PowerShell user group in Charlotte the other day was asking me about checking the time on remote computers. This got me to playing around.

Note   For more information about time synchronization issues, see the following Hey, Scripting Guy! Blog posts: Configuring w32Time Service Logging and Configuring an Authoritative Time Server in Windows Server.

Of course, it is possible to use WMI to query for time information from a remote machine. To do this, use the Win32_LocalTime WMI class. The problem with this is that each property is a piece of the time and, therefore, must be assembled from at least three different properties (unless you also want the date—that is another three properties).

Finding the PDC emulator

By default, the domain’s authoritative time server is the server holding the PDC Emulator FSMO role. The easiest way to find the name of this server is to use the Get-ADDomain cmdlet from the Active Directory module. On Windows PowerShell 3.0, it is not necessary to load the Active Directory module prior to running the command. Therefore, the following command returns the PDC Emulator for my domain.

PS C:\> (Get-ADDomain).pdcemulator

dc1.iammred.net

Check the date / time on a remote computer

The easiest way to obtain the date and time on a remote computer is to simply use the Get-Date cmdlet. By using Windows PowerShell remoting, it is trivial to obtain the remote time information. An example is shown here.

PS C:\> invoke-command -ComputerName dc1 -ScriptBlock {get-date}

Wednesday, October 31, 2012 1:23:42 PM

I can shorten the command considerably by taking advantage of the ICM alias for the Invoke-Command cmdlet and by using positional parameters, as shown here.

PS C:\> icm dc1 {get-date}

Wednesday, October 31, 2012 1:24:24 PM

If I would like to see all of the date / time information, I can pipe the results to the Format-List cmdlet. This is shown here.

PS C:\> icm dc1 {get-date} | fl *

DisplayHint        : DateTime

PSComputerName     : dc1

RunspaceId         : 7cf0452c-688a-4e16-83f5-d9b0ec6ded6e

PSShowComputerName : True

DateTime           : Wednesday, October 31, 2012 2:33:35 PM

Date               : 10/31/2012 12:00:00 AM

Day                : 31

DayOfWeek          : Wednesday

DayOfYear          : 305

Hour               : 14

Kind               : Local

Millisecond        : 879

Minute             : 33

Month              : 10

Second             : 35

Ticks              : 634872908158794870

TimeOfDay          : 14:33:35.8794870

Year               : 2012

On the other hand, it is also possible that what I need to do is to see if there is a time offset between my computer and the server. To do this, I can use the new-TimeSpan cmdlet to measure the difference between the two Get-Date commands. Keep in mind that part of the time offset could be attributable to the time it takes to make the remote connection and to run the command and to return the information. How this affects the time, however, depends on whether my local system time is fast or slow when compared with the remote server. The command itself is rather simple. I use the Get-Date cmdlet from my local computer as the start of the timespan. I then use the time from the remote server as the end time. The command and associated results are shown here.

PS C:\> new-timespan -Start (get-date) -end (icm dc1 {get-date})

Days              : 0

Hours             : 0

Minutes           : 0

Seconds           : 0

Milliseconds      : -311

Ticks             : -3116406

TotalDays         : -3.60695138888889E-06

TotalHours        : -8.65668333333333E-05

TotalMinutes      : -0.00519401

TotalSeconds      : -0.3116406

TotalMilliseconds : -311.6406

Sync with an external time source

The time skew between my computer and the server is less than half of a second—certainly well within tolerance. But what if I had a greater time skew? Well, I would first resync my server with the external time source. To do this, I would use the W32tm command.

Note   For more information about the topic of resyncing time sources, see this article at the TechNet Library.

The following command runs W32tm and tells the remote server DC1 to resync with Time.Windows.Com. The output states that the results are successful.

 PS C:\> icm dc1 {w32tm /config /syncfromflags:manual /manualpeerlist:time.windows.com}

The command completed successfully.

Note   By using the command to resync with the time source requires Admin rights.

Once I have caused the server to resync with the external time source, I will resync my local computer with the server. This command is shown here.

PS C:\> w32tm /resync

Sending resync command to local computer

The command completed successfully.

Once I have resynced both the time server and the workstation, I use the New-TimeSpan command to monitor for any difference.

PS C:\> new-timespan -Start (get-date) -end (icm dc1 {get-date})

Days              : 0

Hours             : 0

Minutes           : 0

Seconds           : 0

Milliseconds      : -270

Ticks             : -2707415

TotalDays         : -3.13358217592593E-06

TotalHours        : -7.52059722222222E-05

TotalMinutes      : -0.00451235833333333

TotalSeconds      : -0.2707415

TotalMilliseconds : -270.7415

If I need to double-check the time source settings on the remote time server, I use the W32tm command to query the configuration. The command is shown here.

icm dc1 {w32tm /query /configuration}

 Join me tomorrow when I will talk about more cool Windows PowerShell stuff.

I invite you to follow me on Twitter and Facebook. If you have any questions, send email to me at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. See you tomorrow. Until then, peace.

Ed Wilson, Microsoft Scripting Guy