how do I detect user operating system

柔情痞子 提交于 2019-11-26 13:04:01

问题


I have the following code to obtain user details:

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
};

This works great but I noticed that the Platform always says windows NT for my machine not Windows 7. Is there any way to detect this type of information in ASP.Net?


回答1:


Here's what I came up with and it seems to work fairly well:

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;
}



回答2:


Use 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
}



回答3:


According to This Official Microsoft Document we can use this to detect Windows OS:

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
}



回答4:


There is a cool tool named: https://github.com/ua-parser/uap-csharp
that parse the user agent to OS,Browser,Browser version etc...
Link to Nuget

And this is how used it:

 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;
 }



回答5:


All In One Class

  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;
            }
        }

Usage

var os = new OS();
os.os_name; // here is os name
os.os_version; // here is os vers



回答6:


There's no accurate way of doing so as all the information you get from user request's headers which can easily be changed by user and can contain just anything.

If you're OK with reading probably inaccurate information then you may want to check this SO answer to similar question




回答7:


Use the version number after "Windows NT". Windows 7 has 6.1 as version number.

But don't rely too much on that, user agent string is non standard. For example look this list, you'll see that someone is using Internet Explorer with Windows 9.0!




回答8:


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;
    }

}



回答9:


The VB.NET answer: I include it only because it might be easier to read and understand.

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



回答10:


John the VB function is nice but the line for Windows 10 does not work because you have "WINDOWS" in uppercase.

It should be same as others i.e.

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



回答11:


Try this I just Modify

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;
}


来源:https://stackoverflow.com/questions/9734668/how-do-i-detect-user-operating-system

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!