web-dev-qa-db-fra.com

Détecter les fenêtres 64 bits ou 32 bits de l'agent utilisateur ou de Javascript?

Je veux offrir la bonne version d'un téléchargement. Les versions que j'ai sont:

  • Windows 32 bits
  • Windows 64 bits
  • Linux

La détection de Linux à l'aide du champ Agent utilisateur est facile; mais est-il possible de déterminer de manière fiable si Windows est 32 bits ou 64 bits?

Les utilisateurs utilisent peut-être des navigateurs étranges - IE et Firefox sont courants, et nous avons probablement un utilisateur Opera quelque part; peut-être aussi un utilisateur Chrome. Je sais que Windows 7 64 bits est fourni avec les versions 32 bits et 64 bits d'IE, et je voudrais leur envoyer la version 64 bits de mon téléchargement.

(Modifié pour ajouter: je sais que je devrais fournir toutes les options, et je le ferai. Mais les gens ne lisent pas les options . Je voulais donc fournir le bon téléchargement par défaut, pour améliorer la convivialité. Bien sûr, bien que cela soit utile si je comprends bien, c'est extrêmement inutile si je me trompe. Et d'après les réponses jusqu'à présent, il ne semble pas qu'il existe un moyen fiable de le faire).

75
user9876

Essayez ceci, recherche WOW64 (32 bits sur 64 bits) ou Win64 (64 bits natif) dans la chaîne de l'agent utilisateur.

    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");
    }
52
saschabeaumont

J'ai fait quelques tests. Voici les résultats, j'espère que cela aide:

 MacOS 64 bits + Safari 64 bits ou Chrome 32 bits: 
 Window.navigator.platform = MacIntel 
 
 Windows 32 bits + safari: 
 window.navigator.platform = Win32 
 
 Windows 64 bits + IE 64 bits: 
 window.navigator.platform = Win64 
 window.navigator.cpuClass = x64 
 
 Windows 64 bits + IE 32 bits: 
 Window.navigator.platform = Win32 
 Window.navigator.cpuClass = x86 
 
 64 bits Windows + 32 Firefox (ou Chrome): 
 Window.navigator.platform = Win32 
 
 32 bits linux mint (i686) + firefox: 
 Fenêtre .navigator.platform = Linux i686 
 
 Ubuntu 64 bits (x86_64) + Chrome 32 bits: 
 window.navigator.platform = Linux i686 
 
 Ubuntu 64 bits + Epiphanie 64 bits: 
 Window.navigator.platform = Linux x86_64 

Jusqu'à présent, j'ai utilisé ce code:

deployJava.isWin64OS = function() {
    return navigator.userAgent.indexOf('WOW64')>-1 || window.navigator.platform=='Win64';
};
38
mgabor6

En analysant autour de 14000 agents utilisateurs uniques ( d'ici ), j'ai trouvé les chaînes suivantes à rechercher:

  • x86_64
  • x86-64
  • Win64
  • x64; (Attention au point-virgule! Sans lui, vous aurez des faux positifs.)
  • AMD64
  • AMD64
  • WOW64
  • x64_64

De plus, bien qu'ils aient des jeux d'instructions différents et ne soient pas compatibles avec Intel x86_64, vous souhaiterez peut-être détecter les éléments suivants:

  • ia64
  • sparc64
  • ppc64
  • IRIX64

Attention cependant, ne cherchez pas simplement quelque chose contenant "64" ou même "x64". Les numéros de build, araignées/bots, bibliothèques, versions .NET, résolutions, etc. de Chrome peuvent également contenir la chaîne "x64" tout en étant un système d'exploitation 32 bits (ou autre).

Notez que vous pouvez rechercher toutes ces chaînes sans tenir compte de la casse.

Je n'ai rien trouvé sur ARM. Peut-être quelqu'un d'autre? Veuillez éditer, c'est un wiki communautaire.

29
Luc

Vous pouvez vérifier le window.navigator.platform et le window.navigator.cpuClass.

Je ne suis pas sûr de votre situation, mais je considérerais simplement faire ce que font la plupart des autres sites et laisser l'utilisateur choisir le téléchargement qu'ils obtiennent. Ils pourraient le télécharger pour une autre machine, pour mettre sur un périphérique flash, ou tout simplement vouloir simplement que la version 32 bits s'exécute sur leur boîtier 64 bits. Quelle que soit la raison, je préférerais avoir le choix.

24
RC.

La solution la plus fiable serait de créer une application de chargeur 32 bits qui détecte l'architecture, puis télécharge et installe la version appropriée de votre application.

J'ai vérifié les deux autres réponses de RC et Pino. Ils ne fonctionnent pas tous les deux à cause du même problème que vous le suggérez - 32 bits IE sur Windows 64 bits identifiera à tort la plate-forme comme 32 bits. Comme la plupart des gens exécutent 32 bits = IE sur Windows 64 bits (de nombreux plugins, par exemple Flash ne sont pas disponibles en 64 bits), il y aura beaucoup d'identifications inexactes

Lee

18
Lee Atkinson

Pas avec une certitude à 100% car vous dites que le navigateur pourrait être une version 32 bits tandis que le système d'exploitation un 64 bits.

Pour détecter le navigateur, veuillez essayer le code suivant:

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

CPU: ia64

Pour IE.

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

Produit commercial: https://www.cyscape.com/showbrow.aspx

8
LiamB

Pour Windows 64 bits avec 64 bits IE window.navigator.platform sera "Win64" et window.navigator.cpuClass sera "x64".

Pour Windows 64 bits avec IE 32 bits, window.navigator.platform sera "Win32" et window.navigator.cpuClass sera "x86".

Pour Windows 32 bits, window.navigator.platform sera "Win32" et window.navigator.cpuClass ne sera pas défini (je pense).

-

Source: J'ai créé ne application qui utilise JavaScript pour déterminer si quelqu'un utilise un processeur 32 bits ou 64 bits . Vous pouvez voir le code ici sur GitHub .

4
peterhurford

J'ai repris les résultats de la recherche Nice ci-dessus dans ces fonctions JS. J'espère qu'ils pourront aider tout le monde ici à rattraper une réponse rapide à leurs besoins (et aussi aux miens!)

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

Essaye-le:

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" ) );

Merci à tout le monde!

3
Sandro Rosa

J'ai utilisé le code suivant:

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

Cela a fonctionné partout, attendez-vous aux ordinateurs Mac. Et malheureusement, il n'est pas possible d'obtenir ces informations via JavaScript :(. Cependant, une autre astuce pourrait y être effectuée. Étant donné qu'Adobe ne prend pas en charge Flash Player sur les navigateurs x64, vous pouvez simplement essayer de le détecter. Si la détection réussit, que c'est certainement un navigateur 32 bits, sinon, que c'est un navigateur 32 bits sans plugin flash ou que c'est un navigateur 64 bits. Parce que le taux de pénétration de Flash player est assez énorme (voir http://www.Adobe.com/ products/player_census/flashplayer/version_penetration.html ), cela devrait être suffisant pour détecter au moins le navigateur x32 sous Mac.

2
GermanZ

Window.navigator.cpuClass et window.navigator.platform renvoient la plate-forme du navigateur. Pas la plate-forme système. Donc, si vous exécutez un navigateur 32 bits sur un système 64 bits, les deux varibales renverraient 32 bits. Ce qui serait incorrect.

1
Dan

64 bits IE sur Windows 64 bits pour tout navigateur Internet Explorer

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");

}
1
ashish

J'ai trouvé cette vieille question et j'ai pensé à mettre à jour avec une bibliothèque open source récente que j'ai trouvée: https://github.com/faisalman/ua-parser-js

Selon les documents, la méthode getCPU()returns { architecture: '' }, avec les valeurs possibles suivantes: 68k, AMD64, arm, arm64, avr, ia32, ia64, irix, irix64, mips, mips64, pa-risc, ppc, sparc, sparc64.

0
don