web-dev-qa-db-fra.com

comment détecter le système d'exploitation de l'utilisateur

J'ai le code suivant pour obtenir les détails de l'utilisateur:

HttpBrowserCapabilities bc = HttpContext.Current.Request.Browser;
string UserAgent = HttpContext.Current.Request.UserAgent;

ENT_TrackingData ret = new ENT_TrackingData()
{
    IPAddress = HttpContext.Current.Request.UserHostAddress,
    Browser = bc.Browser + " " + bc.Version,                
    DateStamp = DateTime.Now,
    PageViewed = HttpContext.Current.Request.Url.AbsolutePath,
    NodeId = UmbracoHelper.GetCurrentNodeID(),
    IsMobileDevice = IsMobileDevice(UserAgent),
    Platform = bc.Platform
};

Cela fonctionne très bien, mais j'ai remarqué que la plate-forme indiquait toujours que Windows NT pour ma machine, et non pas Windows 7. Est-il possible de détecter ce type d'informations dans ASP.Net?

20
Funky

Voici ce que je suis venu avec et cela semble fonctionner assez bien:

public String GetUserEnvironment(HttpRequest request)
{
    var browser = request.Browser;
    var platform = GetUserPlatform(request);
    return string.Format("{0} {1} / {2}", browser.Browser, browser.Version, platform);
}

public String GetUserPlatform(HttpRequest request)
{
    var ua = request.UserAgent;

    if (ua.Contains("Android"))
        return string.Format("Android {0}", GetMobileVersion(ua, "Android"));

    if (ua.Contains("iPad"))
        return string.Format("iPad OS {0}", GetMobileVersion(ua, "OS"));

    if (ua.Contains("iPhone"))
        return string.Format("iPhone OS {0}", GetMobileVersion(ua, "OS"));

    if (ua.Contains("Linux") && ua.Contains("KFAPWI"))
        return "Kindle Fire";

    if (ua.Contains("RIM Tablet") || (ua.Contains("BB") && ua.Contains("Mobile")))
        return "Black Berry";

    if (ua.Contains("Windows Phone"))
        return string.Format("Windows Phone {0}", GetMobileVersion(ua, "Windows Phone"));

    if (ua.Contains("Mac OS"))
        return "Mac OS";

    if (ua.Contains("Windows NT 5.1") || ua.Contains("Windows NT 5.2"))
        return "Windows XP";

    if (ua.Contains("Windows NT 6.0"))
        return "Windows Vista";

    if (ua.Contains("Windows NT 6.1"))
        return "Windows 7";

    if (ua.Contains("Windows NT 6.2"))
        return "Windows 8";

    if (ua.Contains("Windows NT 6.3"))
        return "Windows 8.1";

    if (ua.Contains("Windows NT 10"))
        return "Windows 10";

    //fallback to basic platform:
    return request.Browser.Platform + (ua.Contains("Mobile") ? " Mobile " : "");
}

public String GetMobileVersion(string userAgent, string device)
{
    var temp = userAgent.Substring(userAgent.IndexOf(device) + device.Length).TrimStart();
    var version = string.Empty;

    foreach (var character in temp)
    {
        var validCharacter = false;
        int test = 0;

        if (Int32.TryParse(character.ToString(), out test))
        {
            version += character;
            validCharacter = true;
        }

        if (character == '.' || character == '_')
        {
            version += '.';
            validCharacter = true;
        }

        if (validCharacter == false)
            break;
    }

    return version;
}
27
pistol-pete

Utilisez Request.UserAgent

if (Request.UserAgent.IndexOf("Windows NT 5.1") > 0)
{
//xp
}
else if (Request.UserAgent.IndexOf("Windows NT 6.0") > 0)
{
//Vista
}
else if (Request.UserAgent.IndexOf("Windows NT 6.1") > 0)
{
//7
}
else if (Request.UserAgent.IndexOf("Windows NT 6.2") > 0) 
{ 
//8
}
else if (Request.UserAgent.IndexOf("Windows NT 6.3") > 0) 
{ 
//8.1
}
else if (Request.UserAgent.IndexOf("Windows NT 10.0") > 0) 
{ 
//10
}
18
Habib

Selon Ce document Microsoft officiel nous pouvons l’utiliser pour détecter le système d’exploitation Windows:

String userAgent = Request.UserAgent;

if (userAgent.IndexOf("Windows NT 6.3") > 0)
{
    //Windows 8.1
}
else if (userAgent.IndexOf("Windows NT 6.2") > 0)
{
    //Windows 8
}
else if (userAgent.IndexOf("Windows NT 6.1") > 0)
{
    //Windows 7
}
else if (userAgent.IndexOf("Windows NT 6.0") > 0) 
{ 
    //Windows Vista
}
else if (userAgent.IndexOf("Windows NT 5.2") > 0) 
{ 
    //Windows Server 2003; Windows XP x64 Edition
}
else if (userAgent.IndexOf("Windows NT 5.1") > 0) 
{ 
    //Windows XP
}
else if (userAgent.IndexOf("Windows NT 5.01") > 0) 
{ 
    //Windows 2000, Service Pack 1 (SP1)
}
else if (userAgent.IndexOf("Windows NT 5.0") > 0) 
{ 
    //Windows 2000
}
else if (userAgent.IndexOf("Windows NT 4.0") > 0) 
{ 
    //Microsoft Windows NT 4.0
}
else if (userAgent.IndexOf("Win 9x 4.90") > 0) 
{ 
    //Windows Millennium Edition (Windows Me)
}
else if (userAgent.IndexOf("Windows 98") > 0) 
{ 
    //Windows 98
}
else if (userAgent.IndexOf("Windows 95") > 0) 
{ 
    //Windows 95
}
else if (userAgent.IndexOf("Windows CE") > 0) 
{ 
    //Windows CE
}
else
{ 
    //Others
}
9
Moshtaf

Il existe un outil intéressant nommé: https://github.com/ua-parser/uap-csharp
qui analyse l'agent utilisateur à l'OS, au navigateur, à la version du navigateur, etc.
Lien vers Nuget

Et voici comment on l'utilise:

 public static string GetUserOS(string userAgent)
 {
    // get a parser with the embedded regex patterns
    var uaParser = Parser.GetDefault();
    ClientInfo c = uaParser.Parse(userAgent);
    return c.OS.Family;
 }
6
Offir Pe'er

Il n'y a pas de méthode précise car toutes les informations que vous obtenez à partir des en-têtes de la demande de l'utilisateur peuvent être facilement modifiées par l'utilisateur et peuvent contenir n'importe quoi.

Si vous êtes prêt à lire des informations probablement inexactes, vous pouvez vérifier cette SO réponse à une question similaire

2
Sergey Kudriavtsev

Utilisez le numéro de version après "Windows NT". Windows 7 a 6.1 comme numéro de version. 

Mais ne comptez pas trop sur cela, la chaîne de l'agent utilisateur est non standard . Par exemple, regardez cette liste , vous verrez que quelqu'un utilise Internet Explorer avec Windows 9.0!

2
Adriano Repetti

Tout en un cours

  public class OS
        {
            public string os_name { get; set; }
            public string os_version { get; set; }

            public OS()
            {
                var ua = HttpContext.Current.Request.UserAgent;
                if (ua.Contains("Android"))
                {
                    this.os_name = "Android";
                    SetVersion(ua, "Android");
                    return;
                }

                if (ua.Contains("iPhone"))
                {
                    this.os_name = "iPhone";
                    SetVersion(ua, "OS");
                    return;
                }

                if (ua.Contains("iPad"))
                {
                    this.os_name = "iPad";
                    SetVersion(ua, "OS");
                    return;
                }

                if (ua.Contains("Mac OS"))
                {
                    this.os_name = "Mac OS";
                    return;
                }

                if (ua.Contains("Windows NT 10"))
                {
                    this.os_name = "Windows";
                    this.os_version = "10";
                    return;
                }

                if (ua.Contains("Windows NT 6.3"))
                {
                    this.os_name = "Windows";
                    this.os_version = "8.1";
                    return;
                }

                if (ua.Contains("Windows NT 6.2"))
                {
                    this.os_name = "Windows";
                    this.os_version = "8";
                    return;
                }


                if (ua.Contains("Windows NT 6.1"))
                {
                    this.os_name = "Windows";
                    this.os_version = "7";
                    return;
                }

                if (ua.Contains("Windows NT 6.0"))
                {
                    this.os_name = "Windows";
                    this.os_version = "Vista";
                    return;
                }

                if (ua.Contains("Windows NT 5.1") || ua.Contains("Windows NT 5.2"))

                {
                    this.os_name = "Windows";
                    this.os_version = "XP";
                    return;
                }

                if (ua.Contains("Windows NT 5"))
                {
                    this.os_name = "Windows";
                    this.os_version = "2000";
                    return;
                }

                if (ua.Contains("Windows NT 4"))
                {
                    this.os_name = "Windows";
                    this.os_version = "NT4";
                    return;
                }

                if (ua.Contains("Win 9x 4.90"))
                {
                    this.os_name = "Windows";
                    this.os_version = "Me";
                    return;
                }

                if (ua.Contains("Windows 98"))
                {
                    this.os_name = "Windows";
                    this.os_version = "98";
                    return;
                }

                if (ua.Contains("Windows 95"))
                {
                    this.os_name = "Windows";
                    this.os_version = "95";
                    return;
                }


                if (ua.Contains("Windows Phone"))
                {
                    this.os_name = "Windows Phone";
                    SetVersion(ua, "Windows Phone");
                    return;
                }

                if (ua.Contains("Linux") && ua.Contains("KFAPWI"))
                {
                    this.os_name = "Kindle Fire";
                    return;
                }

                if (ua.Contains("RIM Tablet") || (ua.Contains("BB") && ua.Contains("Mobile")))
                {
                    this.os_name = "Black Berry";
                    return;
                }

                //fallback to basic platform:
                this.os_name = request.Browser.Platform + (ua.Contains("Mobile") ? " Mobile " : "");
            }

            private void SetVersion(string userAgent, string device)
            {
                var temp = userAgent.Substring(userAgent.IndexOf(device) + device.Length).TrimStart();
                var version = string.Empty;

                foreach (var character in temp)
                {
                    var validCharacter = false;
                    int test = 0;

                    if (Int32.TryParse(character.ToString(), out test))
                    {
                        version += character;
                        validCharacter = true;
                    }

                    if (character == '.' || character == '_')
                    {
                        version += '.';
                        validCharacter = true;
                    }

                    if (validCharacter == false)
                        break;
                }
                this.os_version = version;
            }
        }

Utilisation

var os = new OS();
os.os_name; // here is os name
os.os_version; // here is os vers
2
akokani
private string getOS()
{
    string os = null;
    if (Request.UserAgent.IndexOf("Windows NT 5.1") > 0)
    {
        os ="Windows XP";
        return os;
    }
    else if (Request.UserAgent.IndexOf("Windows NT 6.0") > 0)
    {
        os= "Windows Vista";
        return os;
    }
    else if (Request.UserAgent.IndexOf("Windows NT 6.1") > 0)
    {
        os = "Windows 7";
        return os;
    }
    else if (Request.UserAgent.IndexOf("Intel Mac OS X") > 0)
    {
        //os = "Mac OS or older version of Windows";
        os = "Intel Mac OS X";
        return os;
    }
    else
    {
        os = "You are using older version of Windows or Mac OS";
        return os;
    }

}
2
Amir Md Amiruzzaman

La réponse de VB.NET: Je l’inclue uniquement parce qu’il pourrait être plus facile à lire et à comprendre.

Public Function GetOS() As String
    Dim MyAgent As String = Current.Request.UserAgent
    If MyAgent.IndexOf("Windows NT 10.0") >= 0 Then
        Return "Windows 10"
    ElseIf MyAgent.IndexOf("Windows NT 6.3") >= 0 Then
        Return "Windows 8.1"
    ElseIf MyAgent.IndexOf("Windows NT 6.2") >= 0 Then
        Return "Windows 8"
    ElseIf MyAgent.IndexOf("Windows NT 6.1") >= 0 Then
        Return "Windows 7"
    ElseIf MyAgent.IndexOf("Windows NT 6.0") >= 0 Then
        Return "Windows Vista"
    ElseIf MyAgent.IndexOf("Windows NT 5.2") >= 0 Then
        Return "Windows Server 2003"
    ElseIf MyAgent.IndexOf("Windows NT 5.1") >= 0 Then
        Return "Windows XP"
    ElseIf MyAgent.IndexOf("Windows NT 5.01") >= 0 Then
        Return "Windows 2000 (SP1)"
    ElseIf MyAgent.IndexOf("Windows NT 5.0") >= 0 Then
        Return "Windows 2000"
    ElseIf MyAgent.IndexOf("Windows NT 4.5") >= 0 Then
        Return "Windows NT 4.5"
    ElseIf MyAgent.IndexOf("Windows NT 4.0") >= 0 Then
        Return "Windows NT 4.0"
    ElseIf MyAgent.IndexOf("Win 9x 4.90") >= 0 Then
        Return "Windows ME"
    ElseIf MyAgent.IndexOf("Windows 98") >= 0 Then
        Return "Windows 98"
    ElseIf MyAgent.IndexOf("Windows 95") >= 0 Then
        Return "Windows 95"
    ElseIf MyAgent.IndexOf("Windows CE") >= 0 Then
        Return "Windows CE"
    ElseIf (MyAgent.Contains("iPad")) Then
        Return String.Format("iPad OS {0}", GetMobileVersion(MyAgent, "OS"))
    ElseIf (MyAgent.Contains("iPhone")) Then
        Return String.Format("iPhone OS {0}", GetMobileVersion(MyAgent, "OS"))
    ElseIf (MyAgent.Contains("Linux") AndAlso MyAgent.Contains("KFAPWI")) Then
        Return "Kindle Fire"
    ElseIf (MyAgent.Contains("RIM Tablet") OrElse (MyAgent.Contains("BB") AndAlso MyAgent.Contains("Mobile"))) Then
        Return "Black Berry"
    ElseIf (MyAgent.Contains("Windows Phone")) Then
        Return String.Format("Windows Phone {0}", GetMobileVersion(MyAgent, "Windows Phone"))
    ElseIf (MyAgent.Contains("Mac OS")) Then
        Return "Mac OS"
    ElseIf MyAgent.IndexOf("Android") >= 0 Then
        Return String.Format("Android {0}", GetMobileVersion(MyAgent, "Android"))
    Else
        Return "OS is unknown."
    End If
End Function

Private Function GetMobileVersion(userAgent As String, device As String) As String
    Dim ReturnValue As String = String.Empty
    Dim RawVersion As String = userAgent.Substring(userAgent.IndexOf(device) + device.Length).TrimStart()
    For Each character As Char In RawVersion
        If IsNumeric(character) Then
            ReturnValue &= character
        ElseIf (character = "." OrElse character = "_") Then
            ReturnValue &= "."
        Else
            Exit For
        End If
    Next
    Return ReturnValue
End Function
1
John Grabauskas

John, la fonction VB est agréable, mais la ligne de Windows 10 ne fonctionne pas, car "WINDOWS" est en majuscule.

Il devrait être identique aux autres, c.-à-d.

If MyAgent.IndexOf("Windows NT 10.0") >= 0 Then
        Return "Windows 10"
0
Frank Smith

Essayez ceci je viens de modifier 

string device = getOSInfo();

public String getOSInfo()
{
    var ua = Request.UserAgent;

    if (ua.Contains("Android"))
        return string.Format("Android {0}", GetMobileVersion(ua, "Android"));

    if (ua.Contains("iPad"))
        return string.Format("iPad OS {0}", GetMobileVersion(ua, "OS"));

    if (ua.Contains("iPhone"))
        return string.Format("iPhone OS {0}", GetMobileVersion(ua, "OS"));

    if (ua.Contains("Linux") && ua.Contains("KFAPWI"))
        return "Kindle Fire";

    if (ua.Contains("RIM Tablet") || (ua.Contains("BB") && ua.Contains("Mobile")))
        return "Black Berry";

    if (ua.Contains("Windows Phone"))
        return string.Format("Windows Phone {0}", GetMobileVersion(ua, "Windows Phone"));

    if (ua.Contains("Mac OS"))
        return "Mac OS";

    if (ua.Contains("Windows NT 5.1") || ua.Contains("Windows NT 5.2"))
        return "Windows XP";

    if (ua.Contains("Windows NT 6.0"))
        return "Windows Vista";

    if (ua.Contains("Windows NT 6.1"))
        return "Windows 7";

    if (ua.Contains("Windows NT 6.2"))
        return "Windows 8";

    if (ua.Contains("Windows NT 6.3"))
        return "Windows 8.1";

    if (ua.Contains("Windows NT 10"))
        return "Windows 10";

    //fallback to basic platform:
    return (ua.Contains("Mobile") ? " Mobile " : "");
}
public String GetMobileVersion(string userAgent, string device)
{
    var temp = userAgent.Substring(userAgent.IndexOf(device) + device.Length).TrimStart();
    var version = string.Empty;

    foreach (var character in temp)
    {
        var validCharacter = false;
        int test = 0;

        if (Int32.TryParse(character.ToString(), out test))
        {
            version += character;
            validCharacter = true;
        }

        if (character == '.' || character == '_')
        {
            version += '.';
            validCharacter = true;
        }

        if (validCharacter == false)
            break;
    }

    return version;
}