2012-03-16 8 views
15

Ho il seguente codice per ottenere i dettagli dell'utente:Come faccio a rilevare il sistema operativo dell'utente

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

Questa grande opera, ma ho notato che la piattaforma dice sempre di Windows NT per la mia macchina non Windows 7. C'è qualche modo per rilevare questo tipo di informazioni in ASP.Net?

+1

Se si utilizza Windows 7, la piattaforma _is_ "Windows NT". Forse hai bisogno di cercare qualcosa che possa darti il ​​numero di versione della piattaforma? –

+0

Leggi la mia risposta qui sotto per la soluzione più aggiornata. –

risposta

2

Non esiste il preciso come tutte le informazioni ottenute dalle intestazioni della richiesta dell'utente che possono essere facilmente modificate dall'utente e possono contenere qualsiasi cosa.

Se sei OK con la lettura informazioni imprecise probabilmente allora si consiglia di controllare this SO answer to similar question

+0

A mio parere, la maggior parte degli utenti non sa nemmeno quali intestazioni delle richieste sono, per non parlare di modificarle attivamente per * mascherare/nascondere * la piattaforma con cui si stanno connettendo. La tua affermazione dovrebbe leggere: "Se stai bene leggendo * potenzialmente * informazioni imprecise ...." –

18

Usa 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 
} 
+0

else if (Request.UserAgent.IndexOf ("Windows NT 6.2")> 0) { // 8 } – mjb

+0

@mjb, vai avanti e modifica la risposta se ne sei sicuro, non ho Win 8 per confermare – Habib

+0

else if (Request.UserAgent.IndexOf ("Windows NT 6.3")> 0) {//8.1 } – Dreamwalker

1

Utilizzare il numero di versione dopo "Windows NT". Windows 7 ha 6.1 come numero di versione.

Ma non fare troppo affidamento su questo, la stringa utente è non standard. Ad esempio, guarda this list, vedrai che qualcuno sta usando Internet Explorer con Windows 9.0!

+1

Questi potrebbero essere Microsoft ingegneri che testano il nuovo sistema operativo;) –

+1

Lo voglio, sto per installare il mio nuovo Visual Studio 14.0! : P –

+0

Flash forward, ho il 2015, woot. –

3
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

Secondo This Official Microsoft Document possiamo usare questo per rilevare il sistema operativo 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 
} 
16

Ecco cosa mi è venuta e sembra funzionare abbastanza bene:

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

Funziona molto bene, grazie – Manish

3

C'è una cool tool chiamato: https://github.com/ua-parser/uap-csharp
che analizza l'agente utente su OS, Browser, versione del browser, ecc ...
Link to Nuget

E questo è il modo usato:

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

È questo il tuo strumento? – SolidSnake4444

+0

@ SolidSnake4444 Vorrei, ma no ... Sono contento che ti abbia aiutato. –

1

La risposta VB.NET: includo solo perché potrebbe essere più facile da leggere e capire.

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 
+0

Frank ha ragione. Ho cambiato tutti i WINDOWS in Windows. –

0

John la funzione di VB è bello, ma la linea per Windows 10 non funziona perché si dispone di "finestre" in maiuscolo.

Dovrebbe essere lo stesso come gli altri, vale a dire

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

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

Uso

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