Introduction
New Daylight Saving Time rules go into effect on March 11th, 2007 at 2 AM. Microsoft has provided some sample instructions for updating systems, but there are some serious drawbacks:
- There is no support for Windows 2000 servers or workstations. Actually there is but you have to pay for "Extended Support" to get it.
- The patch for Windows Server 2003 is "optional" so you have to select Custom Windows Updates - not Critical Updates which are the default. THIS IS NO LONGER THE CASE; MICROSOFT RECENTLY CHANGED THE PATCH TO CRITICAL.
- The solution Microsoft proposes for updating multiple computers involves a Computer node Group Policy Object, which is fine but it does require a reboot.
Here is the Microsoft KB on the subject.
Solution
What I did was put together a console application that queries the AD structure by operating system, then uses SysInternal's PsExec tool to execute a registry update on multiple remote machines.
ENVIRONMENT: Visual Studio 2005, .NET 2.0, C# (you will need to add the reference for System.DirectoryServices
)
Here is the code:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.DirectoryServices;
using System.Diagnostics;
namespace MyNamespace
{
class Program
{
static void Main(string[] args)
{
SearchResultCollection results = null;
StreamWriter sw = new StreamWriter("\\\\sharename\\DST$\\results.log", true);
StreamWriter swerr = new StreamWriter("\\\\sharename\\DST$\\errors.log", true);
try
{
string path = "<a href="ldap:
DirectoryEntry entry = new DirectoryEntry(path);
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.PropertiesToLoad.Add("name");
mySearcher.PropertiesToLoad.Add("operatingsystem");
mySearcher.Filter = "(&(objectCategory=computer)
(operatingSystem=Windows 2000 Server))";
results = mySearcher.FindAll();
foreach (SearchResult searchResult in results)
{
ResultPropertyValueCollection valcol = searchResult.Properties["name"];
{
string pc = valcol[0].ToString();
string psargs = "\\\\" + pc + " -u DOMAIN\\username -p password
<a>\\\\sharename\\DST$\\DSTUpdate.bat";
</a> Process proc = new Process();
proc.StartInfo.FileName = "C:\\sharename\\DST\\psexec.exe";
proc.StartInfo.Arguments = psargs;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
proc.WaitForExit();
string output = proc.StandardOutput.ReadToEnd();
sw.WriteLine("Computer: " + pc +
" Result(blank = no update): " + output + "\r\n");
sw.Flush();
proc.Close();
}
}
}
catch (Exception ex)
{
swerr.WriteLine("Error: " + ex.Message);
}
finally
{
if (null != results)
{
results.Dispose();
results = null;
}
sw.Close();
swerr.Close();
}
}
}
}
The file DTSUpdate.bat has just three lines:
@echo off
regedit /s \\sharename\DST$\DSTRegistry.reg
cscript \\sharename\DST$\DSTInfo.vbs
Both of these files (DSTRegistry.reg and DSTInfo.vbs) come directly from Microsoft's Web site.
Conclusion
It seems like the DST issue is sneaking up on a lot of companies. It's probably not going to be that big of a deal, but it is best to be prepared. I thought there would already be something similar posted, but I found nothing... so I am putting it out for general use. If someone finds a way to pipe the PsExec output to a file, I would really like to know how that is done. Thanks.