Wykryć 64-bitowy lub 32-bitowy system Windows w programie User Agent lub Javascript?

80

Chcę zaoferować odpowiednią wersję pliku do pobrania. Wersje, które posiadam to:

  • 32-bitowy system Windows
  • 64-bitowy system Windows
  • Linux

Wykrywanie systemu Linux za pomocą pola User Agent jest łatwe; ale czy można wiarygodnie ustalić, czy system Windows jest 32-bitowy czy 64-bitowy?

Użytkownicy mogą używać dziwnych przeglądarek - IE i Firefox są powszechne i prawdopodobnie mamy gdzieś użytkownika Opery; może też użytkownik Chrome. Wiem, że 64-bitowy system Windows 7 jest dostarczany z 32-bitową i 64-bitową wersją przeglądarki IE i chciałbym przesłać im 64-bitową wersję mojego pliku do pobrania.

(Zredagowano w celu dodania: Wiem, że powinienem podać wszystkie opcje i to zrobię. Ale ludzie nie czytają opcji . Dlatego chciałem domyślnie zapewnić prawidłowe pobieranie, aby poprawić użyteczność. Oczywiście, chociaż jest to pomocne jeśli zrobię to dobrze, jest to bardzo nieprzydatne, jeśli się mylę. A z dotychczasowych odpowiedzi nie wynika, że ​​można to zrobić w wiarygodny sposób).

user9876
źródło
1
Zaskakujące, że twoja wersja Linuksa działa na x86, x64 i ARM.
MSalters
9
„Wersja dla systemu Linux” to kod źródłowy. Wersje systemu Windows są binarne.
user9876

Odpowiedzi:

53

Spróbuj tego, szuka WOW64 (32-bitowy na 64-bitowy) lub Win64 (natywny 64-bitowy) w ciągu agenta użytkownika.

    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
źródło
5
Działa to dobrze, z wyjątkiem Safari w 64-bitowym systemie Windows 7, w którym brakuje WOW64, brakuje Win64 i zgłasza go window.navigator.platformjako win32. Wypróbowałem to w Safari 4 / Win; późniejsze wersje mogą ulec zmianie.
Will Martin
2
Nie w 100% dokładne, ale to dobra wskazówka, ponieważ nie ma lepszego sposobu na niezawodne wykrycie tego.
Vitim.us
39

Zrobiłem kilka testów. Oto wyniki, mam nadzieję, że to pomoże:

64-bitowy MacOS + 64-bitowy Safari lub 32-bitowy Chrome:
window.navigator.platform = MacIntel

32-bitowe Windows + Safari:
window.navigator.platform = Win32

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

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

64-bitowy Windows + 32 Firefox (lub Chrome):
window.navigator.platform = Win32

32-bitowy linux mint (i686) + Firefox:
window.navigator.platform = Linux i686

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

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

Do tej pory użyłem tego kodu:

deployJava.isWin64OS = function() {
    return navigator.userAgent.indexOf('WOW64')>-1 || window.navigator.platform=='Win64';
};
mgabor6
źródło
1
To nie jest dokładne. Windows 64-bit w / Chrome 64-bit daje również „Win32”.
Apollo
31

Analizując około 14000 unikalnych agentów użytkownika ( stąd ), wymyśliłem następujące ciągi znaków do wyszukania:

  • x86_64
  • x86-64
  • Win64
  • x64; (Uwaga na średnik! Bez niego będziesz mieć fałszywe trafienia).
  • amd64
  • AMD64
  • WOW64
  • x64_64

Ponadto, mimo że mają różne zestawy instrukcji i nie są kompatybilne z Intel x86_64, możesz chcieć wykryć następujące elementy:

  • ia64
  • sparc64
  • ppc64
  • IRIX64

Uważaj jednak, nie szukaj niczego, co zawiera „64” lub nawet „x64”. Numery kompilacji Chrome, pająki / boty, biblioteki, wersje .NET, rozdzielczości itp. Mogą również zawierać ciąg „x64”, mimo że jest to 32-bitowy (lub inny) system operacyjny.

Zauważ, że możesz wyszukiwać wszystkie te ciągi bez rozróżniania wielkości liter.

Nie udało mi się znaleźć niczego na ARM. Może ktoś inny? Edytuj, to jest wiki społeczności.

Luc
źródło
Testuję względem RegExp `/ \ barm / i w ciągu UA. Granica słowa przed „arm” jest ważna, w przeciwnym razie pasowałaby również do ciągu UA dla Ubuntu 9.10 (Karmic Koala). Skonstruowałem ten wzorzec na podstawie niektórych ciągów znaków UA na useragentstring.com/pages/All i code.google.com/p/google-web-toolkit/issues/detail?id=8038
Rob W
24

Możesz sprawdzić window.navigator.platformi window.navigator.cpuClass.

Nie jestem pewien twojej sytuacji, ale rozważę zrobienie tego, co robi większość innych witryn i pozwolę użytkownikowi wybrać, które pobieranie otrzyma. Mogą pobrać go na inny komputer, umieścić na urządzeniu flash lub po prostu chcieć, aby wersja 32-bitowa działała na ich 64-bitowym pudełku. Bez względu na powód wolałbym mieć wybór.

RC.
źródło
6
Tam, gdzie pracuję, od dawna mamy dostępne wszystkie opcje pobierania, ale użytkownicy często popełniają błąd, pobierając niewłaściwą wersję dla swojego systemu.
exupero
1
Większość użytkowników po prostu wybiera pierwszy z nich, gdy nie są pewni. Jeśli chcesz udzielić użytkownikowi rekomendacji, możesz najpierw umieścić tę wersję, a może nawet uczynić ją nieco większą niż inne.
Philipp,
4
Firefox w systemie Windows 7, 64-bitowy: navigator.cpuClass === undefined, navigator.platform === "Win32". IE9 na tej samej maszynie, navigator.cpuClsas === "x86". Żadne z nich nie jest w ogóle przydatne do wykrywania 64-bitowego systemu Windows. navigator.userAgentzawiera WOW64jednak, więc ta odpowiedź jest ważna.
Chris Morgan,
19

Najbardziej niezawodnym rozwiązaniem byłoby utworzenie 32-bitowej aplikacji ładującej, która wykrywa architekturę, a następnie pobiera i instaluje odpowiednią wersję aplikacji.

Sprawdziłem pozostałe dwie odpowiedzi od RC i Pino. Oba nie działają z powodu tego samego problemu, co sugerujesz - 32-bitowa przeglądarka IE w 64-bitowym systemie Windows błędnie identyfikuje platformę jako 32-bitową. Ponieważ większość ludzi korzysta z 32-bitowej przeglądarki IE w 64-bitowym systemie Windows (wiele wtyczek, np. Flash nie jest dostępnych w wersji 64-bitowej), będzie wiele niedokładnych identyfikatorów

Zawietrzny

Lee Atkinson
źródło
1
Zgaduję, że ktoś (nie ja) przegłosował to, ponieważ nie odpowiada to bezpośrednio na pytanie. Jest to jednak alternatywny sposób realizacji tego, co chcę robić.
user9876
3
32-bitowy IE zawiera token WOW64, więc łatwo byłoby go wyłowić.
Nathan Osman
Moim zdaniem najlepsze i najbardziej przyjazne dla użytkownika rozwiązanie.
Radu
Zdecydowanie nienawidzę tych instalatorów, ale jest to opcja, po prostu nie denerwuj użytkowników, zmuszając ich do zainstalowania również pięknego paska narzędzi.
Vitim.us
9

Nie ze 100% pewnością, jak mówisz, przeglądarka może być wersją 32-bitową, podczas gdy system operacyjny 64-bitowy.

Aby wykryć przeglądarkę, wypróbuj następujący kod:

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

PROCESOR: ia64

W przypadku IE.

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

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

LiamB
źródło
5
Nie dotyczy to pierwotnego pytania. Daje to "x86" na 64-bitowym Windows 7 przy użyciu 32-bitowej przeglądarki IE. Pytanie dotyczyło wykrywania bitowości systemu i systemu operacyjnego, a nie bitowości przeglądarki.
Pete
5

W przypadku 64-bitowego systemu Windows z 64-bitową przeglądarką IE window.navigator.platformbędzie to „Win64” i window.navigator.cpuClass„x64”.

W przypadku 64-bitowego systemu Windows i 32-bitowej przeglądarki IE, window.navigator.platformbędzie to „Win32” i window.navigator.cpuClass„x86”.

Dla 32-bitowego systemu Windows window.navigator.platformbędzie to „Win32” i window.navigator.cpuClassbędzie niezdefiniowane (tak myślę).

-

Źródło: stworzyłem aplikację, która używa JavaScript do określenia, czy ktoś używa procesora 32-bitowego, czy 64-bitowego . Możesz zobaczyć kod tutaj na GitHub .

peterhurford
źródło
Mylisz się co do ostatniego punktu, nie oznacza to, że użytkownik ma komputer z 32-calowym systemem Windows. W rzeczywistości wszystkie powyższe zawierają informacje o przeglądarce, a nie o systemie operacyjnym.
Mo Beigi
3

Wróciłem do wyników ładnego wyszukiwania powyżej do tych funkcji JS. Mam nadzieję, że mogą pomóc wszystkim tutaj, aby szybko odpowiedzieć na ich potrzeby (a także na moje!)

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

Sprawdź to:

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

Dziękuję wszystkim!

Sandro Rosa
źródło
2

Użyłem następującego kodu:

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

Działało wszędzie, poza komputerami Mac. I niestety wygląda na to, że nie jest możliwe uzyskanie tych informacji przez JavaScript :(. Jednak można tam zrobić jeszcze jedną sztuczkę. Ponieważ Adobe nie obsługuje Flash Playera w przeglądarkach x64, możesz po prostu spróbować go wykryć. Jeśli wykrycie się powiedzie, niż jest to zdecydowanie przeglądarka 32-bitowa, jeśli nie, to 32-bitowa przeglądarka bez wtyczki Flash lub przeglądarka 64-bitowa. Ponieważ współczynnik penetracji Flash Playera jest dość duży (patrz http://www.adobe.com/products/player_census/ flashplayer / version_penetration.html ), powinno to wystarczyć, aby przynajmniej wykryć przeglądarkę x32 na Macu.

Hermann
źródło
1

64-bitowa przeglądarka IE w 64-bitowym systemie Windows dla dowolnej przeglądarki 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");

}
popielaty
źródło
1

Zarówno window.navigator.cpuClass, jak i window.navigator.platform zwracają platformę przeglądarki. Nie platforma systemowa. Więc jeśli używasz 32-bitowej przeglądarki w systemie 64-bitowym, obie zmienne zwróciłyby 32-bitowe. Co byłoby niepoprawne.

Dan
źródło
1

Znalazłem to stare pytanie i pomyślałem, że zaktualizuje się za pomocą najnowszej biblioteki open source, którą znalazłem: https://github.com/faisalman/ua-parser-js

Zgodnie z docs, metoda getCPU() returns { architecture: '' }, z następujących możliwości: 68k, amd64, arm, arm64, avr, ia32, ia64, irix, irix64, mips, mips64, pa-risc, ppc, sparc, sparc64.

don
źródło