Обнаружить 64-битную или 32-битную Windows через пользовательский агент или Javascript?

80

Я хочу предложить правильную версию для скачивания. У меня есть следующие версии:

  • 32-битная Windows
  • 64-битная Windows
  • Linux

Обнаружить Linux с помощью поля User Agent легко; но можно ли достоверно выяснить, является ли Windows 32-битной или 64-битной?

Пользователи могут использовать странные браузеры - распространены IE и Firefox, и у нас, вероятно, где-то есть пользователь Opera; возможно, пользователь Chrome тоже. Я знаю, что 64-битная Windows 7 поставляется с 32-битной и 64-битной версиями IE, и я хотел бы отправить им обе 64-битные версии моей загрузки.

(Отредактировано для добавления: я знаю, что должен предоставить все варианты, и я это сделаю. Но люди не читают варианты . Поэтому я хотел предоставить правильную загрузку по умолчанию, чтобы улучшить удобство использования. Конечно, пока это полезно если я все сделаю правильно, это будет крайне бесполезно, если я ошибаюсь. И, судя по ответам, не похоже, что есть надежный способ сделать это).

user9876
источник
1
Удивительно, что ваша версия Linux работает на x86, x64 и ARM.
MSalters
9
«Версия для Linux» - это исходный код. Версии для Windows бинарные.
user9876

Ответы:

53

Попробуйте это, ищет WOW64 (32-разрядный на 64-разрядном) или Win64 (собственный 64-разрядный) в строке пользовательского агента.

    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
источник
5
Это работает хорошо, за исключением Safari в 64-битной Windows 7, в которой отсутствует WOW64, отсутствует Win64 и window.navigator.platformотображается как win32. Я пробовал в Safari 4 / Win; более поздние версии могут измениться.
Уилл Мартин
2
Не на 100% точно, но это хорошая подсказка, поскольку лучшего способа надежного обнаружения нет.
Vitim.us
39

Я сделал несколько тестов. Вот результаты, надеюсь, они помогут:

64-битная MacOS + 64-битная Safari или 32-битная Chrome:
window.navigator.platform = MacIntel

32-битные окна + сафари:
window.navigator.platform = Win32

64-битная Windows + 64-битная IE:
window.navigator.platform = Win64
window.navigator.cpuClass = x64

64-битная Windows + 32-битный IE:
window.navigator.platform = Win32
window.navigator.cpuClass = x86

64-битная Windows + 32 Firefox (или Chrome):
window.navigator.platform = Win32

32-битный Linux Mint (i686) + Firefox:
window.navigator.platform = Linux i686

64-битный Ubuntu (x86_64) + 32-битный Chrome:
window.navigator.platform = Linux i686

64-битная Ubuntu + 64-битная Epiphany:
window.navigator.platform = Linux x86_64

Пока я использовал этот код:

deployJava.isWin64OS = function() {
    return navigator.userAgent.indexOf('WOW64')>-1 || window.navigator.platform=='Win64';
};
мгабор6
источник
1
Это не совсем так. 64-разрядная версия Windows с 64-разрядной версией Chrome также дает "Win32".
Apollo
31

Проанализировав около 14000 уникальных пользовательских агентов ( отсюда ), я придумал следующие строки, которые нужно искать:

  • x86_64
  • x86-64
  • Win64
  • x64; (Обратите внимание на точку с запятой! Без нее будут ложные срабатывания.)
  • amd64
  • AMD64
  • WOW64
  • x64_64

Кроме того, хотя они имеют разные наборы инструкций и несовместимы с Intel x86_64, вы можете захотеть обнаружить следующее:

  • ia64
  • sparc64
  • ppc64
  • IRIX64

Однако будьте осторожны, не ищите просто что-либо, содержащее "64" или даже "x64". Номера сборок Chrome, пауки / боты, библиотеки, версии .NET, разрешения и т. Д. Также могут содержать строку «x64», будучи 32-битной (или другой) ОС.

Обратите внимание, что вы можете искать все эти строки без учета регистра.

Я не смог ничего найти на ARM. Может, кто-то еще? Пожалуйста, отредактируйте, это вики сообщества.

Люк
источник
Я тестирую на соответствие RegExp `/ \ barm / i в строке UA. Граница слова перед словом «рука» важна, иначе она также будет соответствовать строке UA для Ubuntu 9.10 (Karmic Koala). Я построил этот шаблон на основе некоторых строк UA по адресу useragentstring.com/pages/All и code.google.com/p/google-web-toolkit/issues/detail?id=8038
Роб В.
24

Вы можете проверить window.navigator.platformи window.navigator.cpuClass.

Я не уверен в вашей ситуации, но я бы подумал о том, чтобы просто сделать то, что делают большинство других сайтов, и позволить пользователю выбирать, какую загрузку они получить. Они могут загрузить его на другую машину, чтобы установить флэш-устройство, или просто могут захотеть, чтобы 32-разрядная версия работала на их 64-разрядном компьютере. Какой бы ни была причина, я предпочел бы иметь выбор.

RC.
источник
6
Там, где я работаю, у нас уже давно были доступны все варианты загрузки, но пользователи часто совершают ошибку, загружая неправильную версию для своей системы.
exupero
1
Большинство пользователей просто выбирают первый, когда не уверены. Если вы хотите дать пользователю рекомендацию, вы можете разместить эту версию первой и, возможно, даже сделать ее немного больше, чем другие.
Филипп
4
Firefox в Windows 7, 64-разрядная версия: navigator.cpuClass === undefined, navigator.platform === "Win32". IE9 на той же машине, navigator.cpuClsas === "x86". Ни один из них не может использоваться для обнаружения 64-битной Windows. navigator.userAgentвсе же содержит WOW64, так что ответ действителен.
Крис Морган
19

Самым надежным решением было бы создать 32-битное приложение-загрузчик, которое определяет архитектуру, а затем загружает и устанавливает соответствующую версию вашего приложения.

Я проверил два других ответа от RC и Pino. Они оба не работают из-за той же проблемы, которую вы предлагаете - 32-разрядный IE в 64-разрядной Windows ошибочно идентифицирует платформу как 32-разрядную. Поскольку большинство людей запускают 32-битный IE в 64-битной Windows (многие плагины, например, Flash, недоступны в 64-битной версии), будет много неточных идентификаторов.

Ли

Ли Аткинсон
источник
1
Я предполагаю, что кто-то (не я) проголосовал против, потому что он не дает прямого ответа на вопрос. Однако это альтернативный способ выполнить то, что я хочу делать.
user9876
3
32-битный IE включает в себя токен WOW64, поэтому его будет легко выбрать.
Натан Осман,
На мой взгляд, лучшее и самое удобное решение.
Radu
Я определенно ненавижу эти установщики, но это вариант, пожалуйста, просто не раздражайте своих пользователей, заставляя их также установить вашу красивую панель инструментов.
Vitim.us
9

Не со 100% уверенностью, как вы говорите, браузер может быть 32-битной версией, а ОС - 64-битной.

Чтобы обнаружить браузер, попробуйте следующий код:

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

Процессор: ia64

Для IE.

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

Коммерческий продукт: https://www.cyscape.com/showbrow.aspx

LiamB
источник
5
Это не касается исходного вопроса. Это дает "x86" в 64-битной системе Windows 7 с 32-битным IE. Вопрос просил определить разрядность системы и ОС, а не разрядность браузера.
Пит
5

Для 64-битной Windows с 64-битным IE window.navigator.platformбудет «Win64» и window.navigator.cpuClassбудет «x64».

Для 64-битной Windows с 32-битным IE window.navigator.platformбудет «Win32» и window.navigator.cpuClassбудет «x86».

Для 32-битной Windows window.navigator.platformэто будет Win32 и window.navigator.cpuClassне определено (я думаю).

-

Источник: я сделал приложение, которое использует JavaScript, чтобы определить, использует ли кто-то 32-битный или 64-битный процессор . Вы можете увидеть код здесь, на GitHub .

Питерфорд
источник
Вы ошиблись в своем последнем пункте, это не значит, что у пользователя 32-но оконная машина. На самом деле все вышеперечисленное дает вам информацию только о браузере, а не об ОС.
Мо Бейги
3

Я возобновил результаты красивого поиска выше по этим JS-функциям. Надеюсь, они смогут помочь каждому здесь быстро отреагировать на свои нужды (а также и на мои!)

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

Проверь это:

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

Спасибо всем!

Сандро Роза
источник
2

Я использовал следующий код:

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

Он работал везде, кроме компьютеров Mac. И, к сожалению, кажется, что невозможно получить эту информацию через JavaScript :(. Однако здесь можно сделать еще один трюк. Поскольку Adobe не поддерживает flash-плеер в браузерах x64, вы можете просто попытаться обнаружить его. Если обнаружение прошло успешно, чем это определенно 32-битный браузер, если нет, то это 32-битный браузер без флэш-плагина или 64-битный браузер. Поскольку скорость проникновения Flash-плеера довольно велика (см. http://www.adobe.com/products/player_census/ flashplayer / version_penetration.html ), этого должно быть достаточно, чтобы, по крайней мере, обнаружить браузер x32 под Mac.

Германн
источник
1

64-битный IE в 64-битной Windows для любого браузера 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

Оба window.navigator.cpuClass и window.navigator.platform возвращают платформу браузера. Не системная платформа. Поэтому, если вы используете 32-разрядный браузер в 64-разрядной системе, оба варианта будут возвращать 32-разрядные. Что было бы неверно.

Дэн
источник
1

Я нашел этот старый вопрос и подумал об обновлении с помощью недавней библиотеки с открытым исходным кодом, которую я нашел: https://github.com/faisalman/ua-parser-js

Согласно документации, метод getCPU() returns { architecture: '' }, со следующими возможными значениями: 68k, amd64, arm, arm64, avr, ia32, ia64, irix, irix64, mips, mips64, pa-risc, ppc, sparc, sparc64.

дон
источник