views:

163

answers:

4

I need to display additional information on a web page (PHP) if one of the following criteria is met:

  • .NET Framework Installed on the client machine in lower than 3.5
  • Impossible to determine if .NET Framework 3.5 is installed or not on the client machine

I know that some browser (if not only one, IE) is sending that information in his tag.

Can any of you provide me with his suggestions ?

Website is built in PHP.

Thanks!

EDIT:

Proposed answers are incomplete and/or don't provide me with a robust solution.

+4  A: 

The only way to get this information is from the user agent that the browser sends. You can parse the .NET version from there. But note that client can spoof this information or omit it completely, so I wouldn't base any critical functionality on this.

Jan Hančič
The problem with this is that .NET Framework versions 2, 3, and 3.5 all use the same version of the CLR. It's also not going to work unless the user in question has Silverlight installed.
Billy ONeal
That's true, but in the tag, the entry .NET CLR 3.5.30729 is there in addition of the entry .NET CLR 2.0.50727. I'm more interested in the highest entry/version
Pierre 303
+3  A: 

I would try and do a strstr on the UserAgent in PHP, Example Below

A .NET User Agent : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Pivim Multibar; GTB6.4; .NET CLR 2.0.50727)

The PHP:

<?php
function DotNetInstalled($ua = false)
{
    $ua = $ua ? $ua : $_SERVER['HTTP_USER_AGENT'];
    //return (strstr('.NET CLR',$ua) !== false);
    $matches = preg_match('^\.NET CLR ([0-4]+\.)?([0-9]\.)?(\*|\d+)$',$ua);
    if((int)$matches[1] > 0)
    {
       return array(
           (int)$matches[1],
           (int)$matches[2],
           (int)$matches[3],
       );
    }
    return false;
}

if(false !== ($version = DotNetInstalled()))
{
   //Show me the money
   //$version[0] = 2
   //$version[1] = 0
   //$version[2] = 50727
}
?>

I would also check out the following PEAR Package : http://pear.php.net/package/Net_UserAgent_Detect ?>

RobertPitt
The problem with this is that .NET Framework versions 2, 3, and 3.5 all use the same version of the CLR. It's also not going to work unless the user in question has Silverlight installed.
Billy ONeal
That's true, but in the tag, the entry .NET CLR 3.5.30729 is there in addition of the entry .NET CLR 2.0.50727. I'm more interested in the highest entry/version
Pierre 303
A: 

Info about .NET CLR versions in the UserAgent:

Peter Forss
The problem with this is that .NET Framework versions 2, 3, and 3.5 all use the same version of the CLR. It's also not going to work unless the user in question has Silverlight installed.
Billy ONeal
Peter, I've received your message. I'm not sure where to answer it so I do it here. I've no acceptable answers yet. I will wait few more days hoping I'll get the correct answer.
Pierre 303
+1  A: 

Here is another version I actually made for a friend of mine and realised that there was a bounty on this thread so what the hell :)

This is fully working but only with User-agent strings as there is no alternative means of doing so.

The core class:

class NETFrameworkChecker
{
    //General String / Array holders
    var $original_au,$ua_succesParse,$ua_componants,$ua_dotNetString,$CLRTag = "";

    //IsInstalled
    var $installed = false;

    //Version holders
    public $major = 0,$minor = 0,$build = 0;

    public function __construct($ua = false)
    {
        $this->original_au = $ua !== false ? $ua : $_SERVER['HTTP_USER_AGENT'];
        $this->ParserUserAgent();
    }

    public function Installed(){return (bool)$this->installed;}

    public function AUTag(){return $this->CLRTag;}

    //Version Getters
    public function getMajor(){return $this->major;}
    public function getMinor(){return $this->minor;}
    public function getBuild(){return $this->build;}

    private function ParserUserAgent()
    {
        $this->ua_succesParse = (bool) preg_match('/(?<browser>.+?)\s\((?<components>.*?)\)/',$this->original_au,$this->ua_componants);
        if($this->ua_succesParse)
        {
            $this->ua_componants = explode(';',$this->ua_componants['components']);
            foreach($this->ua_componants as $aComponant)
            {
                $aComponant = trim($aComponant);
                if(substr(strtoupper($aComponant),0,4) == ".NET")
                {
                    //We have .Net Installed
                    $this->installed = true;
                    $this->CLRTag = $aComponant;

                    //Lets make sure we can get the versions
                    $gotVersions = (bool)preg_match("/\.NET.CLR.+?(?<major>[0-9]{1})\.(?<minor>[0-9]{1})\.(?<build>[0-9]+)/si",$aComponant,$versions);
                    if($gotVersions)
                    {
                        $this->major = (int)$versions['major'];
                        $this->minor = (int)$versions['minor'];
                        $this->build = (int)$versions['build'];
                    }
                    break;
                }
            }
        }
    }
}

Example Usage:

$Net = new NETFrameworkChecker(); //leave first param blank to detect current user agent

if($Net->Installed())
{
   if($Net->getMajor()> 2 && $Net->getMinor() >= 0)
   {
      //User is using a >NET system thats greater than 2.0.0000
      if($Net->GetBuild() >= 0200)
      {
         //We can do stuff with so that's only supported from this build up-words
      }
   }else
   {
      //Redirect them asking them to upgrade :) pretty please
   }
}

If you also want to check custom UA Strings from DB lets say

$Net = new NETFrameworkChecker("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Pivim Multibar; GTB6.4; .NET CLR 2.0.50727)");
RobertPitt