64-Bit- oder 32-Bit-Windows von User Agent oder Javascript erkennen?

79

Ich möchte die richtige Version eines Downloads anbieten. Die Versionen, die ich habe, sind:

  • 32-Bit-Windows
  • 64-Bit-Windows
  • Linux

Das Erkennen von Linux über das Feld User Agent ist einfach. Aber ist es möglich, zuverlässig herauszufinden, ob Windows 32-Bit oder 64-Bit ist?

Benutzer verwenden möglicherweise seltsame Browser - IE und Firefox sind häufig, und wir haben wahrscheinlich irgendwo einen Opera-Benutzer. Vielleicht auch ein Chrome-Nutzer. Ich weiß, dass 64-Bit-Windows 7 mit 32-Bit- und 64-Bit-Versionen von IE geliefert wird, und ich möchte beiden die 64-Bit-Version meines Downloads senden.

(Bearbeitet, um hinzuzufügen: Ich weiß, dass ich alle Optionen bereitstellen sollte, und ich werde es tun . Aber die Leute lesen die Optionen nicht . Deshalb wollte ich standardmäßig den richtigen Download bereitstellen, um die Benutzerfreundlichkeit zu verbessern. Natürlich, obwohl dies hilfreich ist Wenn ich es richtig verstehe, ist es äußerst wenig hilfreich, wenn ich es falsch verstehe. Und nach den bisherigen Antworten sieht es nicht so aus, als gäbe es einen zuverlässigen Weg, dies zu tun.

user9876
quelle
1
Überraschend, dass Ihre Linux-Version unter x86, x64 und ARM funktioniert.
MSalters
9
Die "Linux-Version" ist Quellcode. Die Windows-Versionen sind binär.
user9876

Antworten:

52

Versuchen Sie dies und suchen Sie in der User-Agent-Zeichenfolge nach WOW64 (32-Bit auf 64-Bit) oder Win64 (natives 64-Bit).

    if (navigator.userAgent.indexOf("WOW64") != -1 || 
        navigator.userAgent.indexOf("Win64") != -1 ){
       alert("This is a 64 bit OS");
    } else {
       alert("Not a 64 bit OS");
    }

saschabeaumont
quelle
5
Dies funktioniert gut, mit Ausnahme von Safari unter 64-Bit-Windows 7, dem WOW64 fehlt, Win64 fehlt und das window.navigator.platformals win32 gemeldet wird. Ich habe es in Safari 4 / Win versucht. spätere Versionen können sich ändern.
Will Martin
2
Nicht 100% genau, aber es ist ein guter Hinweis, da es keinen besseren Weg gibt, es zuverlässig zu erkennen.
Vitim.us
39

Ich habe einige Tests gemacht. Hier sind die Ergebnisse, hoffe es hilft:

64-Bit-MacOS + 64-Bit-Safari oder 32-Bit-Chrome:
window.navigator.platform = MacIntel

32 Bit Windows + Safari:
window.navigator.platform = Win32

64-Bit-Windows + 64-Bit-IE:
window.navigator.platform = Win64
window.navigator.cpuClass = x64

64-Bit-Windows + 32-Bit-IE:
window.navigator.platform = Win32
window.navigator.cpuClass = x86

64 Bit Windows + 32 Firefox (oder Chrome):
window.navigator.platform = Win32

32 Bit Linux Mint (i686) + Firefox:
window.navigator.platform = Linux i686

64-Bit-Ubuntu (x86_64) + 32-Bit-Chrome:
window.navigator.platform = Linux i686

64 Bit Ubuntu + 64 Bit Epiphany:
window.navigator.platform = Linux x86_64

Bisher habe ich diesen Code verwendet:

deployJava.isWin64OS = function() {
    return navigator.userAgent.indexOf('WOW64')>-1 || window.navigator.platform=='Win64';
};
mgabor6
quelle
1
Das stimmt nicht. Windows 64-Bit mit Chrome 64-Bit liefert ebenfalls "Win32".
Apollo
31

Bei der Analyse von ungefähr 14000 eindeutigen Benutzeragenten ( von hier aus ) habe ich die folgenden Zeichenfolgen gefunden:

  • x86_64
  • x86-64
  • Win64
  • x64; (Achten Sie auf das Semikolon! Ohne es haben Sie falsch positive Ergebnisse.)
  • amd64
  • AMD64
  • WOW64
  • x64_64

Obwohl sie unterschiedliche Befehlssätze haben und nicht mit Intel x86_64 kompatibel sind, möchten Sie möglicherweise Folgendes erkennen:

  • ia64
  • sparc64
  • ppc64
  • IRIX64

Beachten Sie jedoch, dass Sie nicht nur nach etwas suchen, das "64" oder sogar "x64" enthält. Die Build-Nummern, Spider / Bots, Bibliotheken, .NET-Versionen, Auflösungen usw. von Chrome können auch die Zeichenfolge "x64" enthalten, während sie noch ein 32-Bit-Betriebssystem (oder ein anderes Betriebssystem) sind.

Beachten Sie, dass Sie nach all diesen Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung suchen können.

Ich konnte auf ARM nichts finden. Vielleicht jemand anderes? Bitte bearbeiten, es ist ein Community-Wiki.

Luc
quelle
Ich teste gegen das RegExp `/ \ barm / i in der UA-Zeichenfolge. Die Wortgrenze vor "Arm" ist wichtig, da sie sonst auch mit der UA-Zeichenfolge für Ubuntu 9.10 (Karmic Koala) übereinstimmt. Ich habe dieses Muster basierend auf einigen UA-Zeichenfolgen unter useragentstring.com/pages/All und code.google.com/p/google-web-toolkit/issues/detail?id=8038
Rob W
24

Sie können das window.navigator.platformund das überprüfen window.navigator.cpuClass.

Ich bin mir nicht sicher, in welcher Situation Sie sich befinden, aber ich würde in Betracht ziehen, nur das zu tun, was die meisten anderen Websites tun, und den Benutzer auswählen zu lassen, welchen Download er erhält. Sie können es für einen anderen Computer herunterladen, ein Flash-Gerät installieren oder einfach nur die 32-Bit-Version auf ihrer 64-Bit-Box ausführen. Was auch immer der Grund sein mag, ich hätte lieber die Wahl.

RC.
quelle
6
Wo ich arbeite, haben wir schon lange alle Download-Optionen zur Verfügung, aber Benutzer machen oft den Fehler, die falsche Version für ihr System herunterzuladen.
Exupero
1
Die meisten Benutzer wählen nur den ersten aus, wenn sie sich nicht sicher sind. Wenn Sie dem Benutzer eine Empfehlung geben möchten, können Sie diese Version zuerst platzieren und sie möglicherweise sogar etwas größer als die anderen machen.
Philipp
4
Firefox unter Windows 7, 64-Bit: navigator.cpuClass === undefined, navigator.platform === "Win32". IE9 auf demselben Computer , navigator.cpuClsas === "x86". Keines davon ist für die Erkennung von 64-Bit-Windows von Nutzen. navigator.userAgententhält WOW64jedoch, so dass die Antwort gültig ist.
Chris Morgan
18

Die zuverlässigste Lösung wäre, eine 32-Bit-Loader-Anwendung zu erstellen, die die Architektur erkennt und dann die entsprechende Version Ihrer Anwendung herunterlädt und installiert.

Ich habe die beiden anderen Antworten von RC und Pino überprüft. Beide funktionieren aufgrund des von Ihnen vorgeschlagenen Problems nicht. Der 32-Bit-IE unter 64-Bit-Windows identifiziert die Plattform fälschlicherweise als 32-Bit. Da die meisten Leute 32-Bit-IE unter 64-Bit-Windows ausführen (viele Plugins, z. B. Flash, sind in 64-Bit nicht verfügbar), gibt es viele ungenaue Identifikationen

Lee

Lee Atkinson
quelle
1
Ich vermute, jemand (nicht ich) hat es abgelehnt, weil es die Frage nicht direkt beantwortet. Es ist jedoch eine alternative Möglichkeit, das zu erreichen, was ich tun möchte.
user9876
3
Der 32-Bit-IE enthält das WOW64-Token, sodass es leicht herauszusuchen ist.
Nathan Osman
Beste und benutzerfreundlichste Lösung meiner Meinung nach.
Radu
Ich hasse diese Installationsprogramme definitiv, aber es ist eine Option. Bitte ärgern Sie Ihre Benutzer nicht, wenn Sie dann gezwungen sind, auch Ihre wunderschöne Symbolleiste zu installieren.
Vitim.us
9

Nicht mit 100% iger Sicherheit, wie Sie sagen, der Browser könnte eine 32-Bit-Version sein, während das Betriebssystem eine 64-Bit-Version ist.

Versuchen Sie den folgenden Code, um den Browser zu erkennen:

<script language=javascript>   
  <!--   
  document.write("CPU :"+window.navigator.cpuClass);   
  //-->   
</script> 

CPU: ia64

Für IE.

http://msdn.microsoft.com/en-us/library/ms531090%28VS.85%29.aspx

Kommerzielles Produkt: https://www.cyscape.com/showbrow.aspx

LiamB
quelle
5
Dies geht nicht auf die ursprüngliche Frage ein. Dies erzeugt "x86" auf einer 64-Bit-Windows 7-Box mit 32-Bit-IE. Die Frage lautete, System-Bit und Betriebssystem zu erkennen, nicht Browser-Bit.
Pete
5

Für 64-Bit-Windows mit 64-Bit-IE window.navigator.platformist "Win64" und window.navigator.cpuClass"x64".

Für 64-Bit-Windows mit 32-Bit-IE ist window.navigator.platform"Win32" und window.navigator.cpuClass"x86".

Für 32-Bit-Windows window.navigator.platformwird "Win32" sein und window.navigator.cpuClasswird undefiniert sein (glaube ich).

- -

Quelle: Ich habe eine App erstellt, die mithilfe von JavaScript ermittelt, ob jemand einen 32-Bit- oder 64-Bit-Prozessor verwendet . Sie können den Code hier auf GitHub sehen .

Peterhurford
quelle
Sie sind in Bezug auf Ihren letzten Punkt falsch. Dies bedeutet nicht, dass der Benutzer über einen 32-Windows-Computer verfügt. In der Tat gibt Ihnen all das nur die Browser-Informationen, nicht das Betriebssystem.
Mo Beigi
3

Ich habe die Ergebnisse der netten Suche oben in diesen JS-Funktionen wieder aufgenommen. Ich hoffe, sie können allen hier helfen, schnell auf ihre Bedürfnisse zu reagieren (und auch auf meine!).

function get_bits_system_architecture()
{
    var _to_check = [] ;
    if ( window.navigator.cpuClass ) _to_check.push( ( window.navigator.cpuClass + "" ).toLowerCase() ) ;
    if ( window.navigator.platform ) _to_check.push( ( window.navigator.platform + "" ).toLowerCase() ) ;
    if ( navigator.userAgent ) _to_check.push( ( navigator.userAgent + "" ).toLowerCase() ) ;

    var _64bits_signatures = [ "x86_64", "x86-64", "Win64", "x64;", "amd64", "AMD64", "WOW64", "x64_64", "ia64", "sparc64", "ppc64", "IRIX64" ] ;
    var _bits = 32, _i, _c ;
    outer_loop:
    for( var _c = 0 ; _c < _to_check.length ; _c++ )
    {
        for( _i = 0 ; _i < _64bits_signatures.length ; _i++ )
        {
            if ( _to_check[_c].indexOf( _64bits_signatures[_i].toLowerCase() ) != -1 )
            {
               _bits = 64 ;
               break outer_loop;
            }
        }
    }
    return _bits ; 
}


function is_32bits_architecture() { return get_bits_system_architecture() == 32 ? 1 : 0 ; }
function is_64bits_architecture() { return get_bits_system_architecture() == 64 ? 1 : 0 ; }

Probier es aus:

document.write( "Which is my current bits system architecture ? " + get_bits_system_architecture() + "<br>" );

document.write( "Is it 32 bits ? " + ( is_32bits_architecture() ? "YES" : "NO" ) + "<br>" );

document.write( "Is it 64 bits ? " + ( is_64bits_architecture() ? "YES" : "NO" ) );

Danke an alle!

Sandro Rosa
quelle
2

Ich habe folgenden Code verwendet:

var is32BitBrowser = true;
if( window.navigator.cpuClass != null && window.navigator.cpuClass.toLowerCase() == "x64" )
   is32BitBrowser = false;
if( window.navigator.platform.toLowerCase() == "win64" )
   is32BitBrowser = false;

Es hat überall funktioniert, wenn man Mac-Computer erwartet. Und leider scheint es nicht möglich zu sein, diese Informationen über JavaScript abzurufen :(. Dort könnte jedoch noch ein weiterer Trick ausgeführt werden. Da Adobe Flash Player in x64-Browsern nicht unterstützte, können Sie einfach versuchen, sie zu erkennen. Wenn die Erkennung erfolgreich ist, als es definitiv ein 32-Bit-Browser ist, wenn nein, dann ist es ein 32-Bit-Browser ohne Flash-Plugin oder ein 64-Bit-Browser, da die Penetrationsrate des Flash-Players ziemlich hoch ist (siehe http://www.adobe.com/products/player_census/). flashplayer / version_penetration.html ), dies sollte gut genug sein, um zumindest den x32-Browser unter Mac zu erkennen.

Hermann
quelle
1

64-Bit-IE unter 64-Bit-Windows für jeden Internet Explorer-Browser

if (navigator.userAgent.indexOf("MSIE") != -1 && navigator.userAgent.indexOf("Win64") != -1 && navigator.userAgent.indexOf("x64") != -1){

   alert("This is 64 bit browser");

}
else {

   alert("Not 64 bit browser");

}
aschfahl
quelle
1

Sowohl window.navigator.cpuClass als auch window.navigator.platform geben die Browserplattform zurück. Nicht die Systemplattform. Wenn Sie also einen 32-Bit-Browser auf einem 64-Bit-System ausführen, geben beide Varibales 32-Bit zurück. Welches wäre falsch.

Dan
quelle
1

Ich habe diese alte Frage gefunden und überlegt, sie mit einer kürzlich gefundenen Open-Source-Bibliothek zu aktualisieren: https://github.com/faisalman/ua-parser-js

Gemäß den Dokumenten die Methode getCPU() returns { architecture: '' }mit den folgenden möglichen Werten : 68k, amd64, arm, arm64, avr, ia32, ia64, irix, irix64, mips, mips64, pa-risc, ppc, sparc, sparc64.

Don
quelle