30

我有以下代码来获取用户详细信息:

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

这很好用,但我注意到平台总是说我的机器不是 Windows 7 的 Windows NT。有没有办法在 ASP.Net 中检测这种类型的信息?

4

11 回答 11

43

这是我想出的,它似乎工作得很好:

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;
}
于 2015-08-20T17:09:06.793 回答
20

使用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
}
于 2012-03-16T09:29:39.290 回答
9

根据This Official Microsoft Document,我们可以使用它来检测 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
}
于 2014-08-24T10:24:46.977 回答
9

有一个很酷的工具,名为:https
://github.com/ua-parser/uap-csharp ,它将用户代理解析为操作系统、浏览器、浏览器版本等...
链接到 Nuget

这就是它的使用方式:

 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;
 }
于 2016-08-08T11:50:24.267 回答
7

一站式服务

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

用法

var os = new OS();
os.os_name; // here is os name
os.os_version; // here is os vers
于 2018-01-24T18:37:11.557 回答
3

试试这个我只是修改

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;
}
于 2018-04-28T08:56:41.507 回答
3

VB.NET 回答:我包含它只是因为它可能更容易阅读和理解。

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
于 2016-09-30T16:19:06.327 回答
2
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;
    }

}
于 2014-02-25T16:20:42.960 回答
2

没有准确的方法可以做到这一点,因为您从用户请求的标头中获得的所有信息都可以由用户轻松更改并且可以包含任何内容。

如果您可以阅读可能不准确的信息,那么您可能需要检查此 SO answer to similar question

于 2012-03-16T09:29:21.463 回答
2

使用“Windows NT”之后的版本号。Windows 7 有 6.1 作为版本号。

但不要过分依赖,用户代理字符串是非标准的。例如查看此列表,您会看到有人在 Windows 9.0 中使用 Internet Explorer!

于 2012-03-16T09:30:47.163 回答
1

John VB 函数很好,但 Windows 10 的行不起作用,因为你有大写的“WINDOWS”。

它应该和其他人一样,即

If MyAgent.IndexOf("Windows NT 10.0") >= 0 Then
        Return "Windows 10"
于 2017-01-11T03:52:49.567 回答