views:

24832

answers:

10

How can I find out if SP1 has been installed on a server which has .NET 3.5?

+55  A: 

Look at

HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5\

The Version value in that key should be 3.5.30729.01

Or the SP value in the same key should be 1

Ray
const string name = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5";RegistryKey subKey = Registry.LocalMachine.OpenSubKey(name);var version = subKey.GetValue("Version").ToString();var servicePack = subKey.GetValue("SP").ToString();
CJCraft.com
+20  A: 

You could go to SmallestDotNet using IE from the server. That will tell you the version and also provide a download link if you're out of date.

Andy May
+8  A: 

Use Add/Remove programs from the Control Panel.

rp
Surely rp should get a special badge for having an answer marked as correct with negative votes?
Guy
Go figure. Later, I thought I missed a "programatically" point to your question, Guy.
rp
+1  A: 

Assuming that the name is everywhere "Microsoft .NET Framework 3.5 SP1", you can use this:

string uninstallKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(uninstallKey))
{
    return rk.GetSubKeyNames().Contains("Microsoft .NET Framework 3.5 SP1");
}
Panos
+8  A: 

Take a look at this article which shows the registry keys you need to look for and provides a .NET library that will do this for you.

First, you should to determine if .NET 3.5 is installed by looking at HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\Install, which is a DWORD value. If that value is present and set to 1, then that version of the Framework is installed.

Look at HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\SP, which is a DWORD value which indicates the Service Pack level (where 0 is no service pack).

To be correct about things, you really need to ensure that .NET Fx 2.0 and .NET Fx 3.0 are installed first and then check to see if .NET 3.5 is installed. If all three are true, then you can check for the service pack level.

Scott Dorman
article link is changed, here it is the new location: http://www.codeproject.com/KB/dotnet/frameworkversiondetection.aspx
marco.ragogna
+5  A: 

All of the answers given so far require having console (direct or remote) access to the server itself. But what if you’re developing an ASP.NET 3.5 SP1 website which requires SP1-specific features such as Dynamic Data, and you need to know if your hosting service has upgraded to 3.5 SP1 on the specific server you’re on?

I think the question was, how do you tell, from just ASP.NET code on an .aspx page, if the remote hosting server has ASP.NET 3.5 SP1 installed? No access to the Registry, to Uninstall files, etc. would be available in such a case.

I, for one, definitely would like to know.

I thought the whole point of web development was not having to cater for every variation in client-side environments.
Sam
A: 

Also, if you want to know if a KB has been installed on top of 3.5 you can check HKLM\Software\Microsoft\Updates\Microsoft .NET Framework 3.5 SP1\\ThisVersionInstalled with the value = "Y"

A: 

Another way is to check version of files on filesystem %WINROOT%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\System.ServiceModel.dll or other dll's and check the versions.

+2  A: 

Check is the following directory exists:

In 64bit machines: %SYSTEMROOT%\Microsoft.NET\Framework64\v3.5\Microsoft .NET Framework 3.5 SP1\

In 32bit machines: %SYSTEMROOT%\Microsoft.NET\Framework\v3.5\Microsoft .NET Framework 3.5 SP1\

Where %SYSTEMROOT% is the SYSTEMROOT enviromental variable (e.g. C:\Windows).

Danny Varod
+4  A: 

I came to this page while trying to figure out how to detect the framework versions installed on a server without access to remote desktop or registry, so Danny V's answer worked for me.

string path = System.Environment.SystemDirectory;
path = path.Substring( 0, path.LastIndexOf('\\') );
path = Path.Combine( path, "Microsoft.NET" );
// C:\WINDOWS\Microsoft.NET\

string[] versions = new string[]{
    "Framework\\v1.0.3705",
    "Framework64\\v1.0.3705",
    "Framework\\v1.1.4322",
    "Framework64\\v1.1.4322",
    "Framework\\v2.0.50727",
    "Framework64\\v2.0.50727",
    "Framework\\v3.0",
    "Framework64\\v3.0",
    "Framework\\v3.5",
    "Framework64\\v3.5",
    "Framework\\v3.5\\Microsoft .NET Framework 3.5 SP1",
    "Framework64\\v3.5\\Microsoft .NET Framework 3.5 SP1",
    "Framework\\v4.0",
    "Framework64\\v4.0"
};

foreach( string version in versions )
{
    string versionPath = Path.Combine( path, version );

    DirectoryInfo dir = new DirectoryInfo( versionPath );
    if( dir.Exists )
    {
        Response.Output.Write( "{0}<br/>", version );
    }
}
Matt
Worked as expected for me. Just created a new website project, added the code and put it on the share, then requested the page.
XIII