using System.Management; ... SelectQuery q = new SelectQuery("Win32_OperatingSystem"); ManagementObjectSearcher s = new ManagementObjectSearcher(q); foreach(ManagementObject mo in s.get()) { Console.WriteLine(mo["ServicePackMajorVersion"]); {It isn't much cleaner than using Win32Api but at least you're staying withing the managed code which is what M$ would like to see - plus it would make your upgrade a lot easier when new .NET Framework versions are released.