从用户代理或 Javascript 检测 64 位或 32 位 Windows?

Posted

技术标签:

【中文标题】从用户代理或 Javascript 检测 64 位或 32 位 Windows?【英文标题】:Detect 64-bit or 32-bit Windows from User Agent or Javascript? 【发布时间】:2010-12-17 01:11:06 【问题描述】:

我想提供正确版本的下载。我拥有的版本是:

32 位 Windows 64 位 Windows Linux

使用用户代理字段检测 Linux 很容易;但是是否有可能可靠地确定 Windows 是 32 位还是 64 位?

用户可能正在使用奇怪的浏览器——IE 和 Firefox 很常见,而且我们可能在某个地方有一个 Opera 用户;也可能是 Chrome 用户。我知道 64 位 Windows 7 附带 32 位和 64 位版本的 IE,我想将我下载的 64 位版本都发送给他们。

(编辑添加:我知道我应该提供所有选项,我会的。但是people don't read the options。所以我想默认提供正确的下载,以提高可用性。当然,虽然这很有帮助,如果我是对的,如果我弄错了,那将非常没有帮助。从目前的答案来看,似乎没有可靠的方法来做到这一点。

【问题讨论】:

令人惊讶的是,您的 Linux 版本可以在 x86、x64 和 ARM 上运行。 “Linux 版本”是源代码。 Windows 版本是二进制的。 【参考方案1】:

试试这个,在用户代理字符串中查找 WOW64(64 位上的 32 位)或 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");
    

【讨论】:

这很好用,除了 64 位 Windows 7 上的 Safari,它缺少 WOW64,缺少 Win64,并将其 window.navigator.platform 报告为 win32。我已经在 Safari 4/Win 中尝试过;以后的版本可能会改变。 不是 100% 准确,但这是一个很好的线索,因为没有更好的方法可以可靠地检测它。 我认为假设用户此时拥有 x64 会更好。使用选择加入检测算法来检测超过 99.5% 的消费者拥有的架构现在应该会产生更多的误报,而不是仅仅假设他们都拥有它。【参考方案2】:

我做了一些测试。以下是结果,希望对您有所帮助:

64 位 MacOS + 64 位 Safari 或 32 位 Chrome: window.navigator.platform=MacIntel 32 位 Windows + Safari: 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) + 火狐: window.navigator.platform=Linux i686 64 位 Ubuntu (x86_64) + 32 位 Chrome: window.navigator.platform=Linux i686 64 位 Ubuntu + 64 位主显节: window.navigator.platform=Linux x86_64

到目前为止,我已经使用了这个代码:

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

【讨论】:

这不准确。 Windows 64 位 w/Chrome 64 位也产生“Win32”。【参考方案3】:

围绕14000 unique user-agents (from here) 进行分析,我想出了以下要查找的字符串:

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 上找不到任何东西。也许是其他人?请编辑,这是一个社区 wiki。

【讨论】:

我正在测试 UA 字符串中的 RegExp `/\barm/i。 “arm”之前的单词边界很重要,否则它也会匹配 Ubuntu 9.10 (Karmic Koala) 的 UA 字符串。我基于useragentstring.com/pages/All 和code.google.com/p/google-web-toolkit/issues/detail?id=8038 的一些UA 字符串构建了这个模式【参考方案4】:

您可以查看window.navigator.platformwindow.navigator.cpuClass

我不确定你的情况,但我会考虑做大多数其他网站所做的事情,让用户选择他们要下载的内容。他们可能将它下载到另一台机器上,放在闪存设备上,或者只是希望 32 位版本在他们的 64 位机器上运行。不管是什么原因,我宁愿选择。

【讨论】:

在我工作的地方,我们已经拥有所有可用的下载选项很长时间了,但用户经常犯错误,为他们的系统下载了错误的版本。 大多数用户在不确定时只会选择第一个。当你想给用户推荐时,你可以把这个版本放在第一位,甚至可以让它比其他版本大一点。 Windows 7 上的 Firefox,64 位:navigator.cpuClass === undefinednavigator.platform === "Win32"。同一台机器上的 IE9,navigator.cpuClsas === "x86"。这些都不能用于检测 64 位 Windows。不过,navigator.userAgent 确实包含WOW64,所以这个答案是有效的。【参考方案5】:

最可靠的解决方案是创建一个 32 位加载器应用程序,该应用程序检测架构,然后下载并安装您的应用程序的适当版本。

我已经检查了 RC 和 Pino 的其他两个答案。由于与您建议的问题相同,它们都不起作用 - 64 位 Windows 上的 32 位 IE 会错误地将平台识别为 32 位。由于大多数人在 64 位 Windows 上运行 32 位 IE(许多插件例如 Flash 在 64 位中不可用),因此会有很多不准确的标识

【讨论】:

我猜有人(不是我)投了反对票,因为它没有直接回答问题。但是,这是完成我想做的事情的另一种方式。 32 位 IE 包含 WOW64 令牌,因此很容易识别。 我认为最好和最用户友好的解决方案。 我绝对讨厌这些安装程序,但这是一个选项,请不要惹恼您的用户,然后强迫您安装漂亮的工具栏。【参考方案6】:

不能 100% 确定您所说的浏览器可能是 32 位版本,而操作系统是 64 位版本。

要检测浏览器,请尝试以下代码:

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

CPU : ia64

对于 IE。

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

商业产品:https://www.cyscape.com/showbrow.aspx

【讨论】:

这不解决原始问题。这会在使用 32 位 IE 的 64 位 Windows 7 机器上生成“x86”。问题是要求检测系统位数和操作系统,而不是浏览器位数。【参考方案7】:

对于带有 64 位 IE 的 64 位 Windows,window.navigator.platform 将是“Win64”,window.navigator.cpuClass 将是“x64”。

对于带有 32 位 IE 的 64 位 Windows,window.navigator.platform 将是“Win32”,window.navigator.cpuClass 将是“x86”。

对于 32 位 Windows,window.navigator.platform 将是“Win32”,window.navigator.cpuClass 将是未定义的(我认为)。

-

来源:我发了an app that uses JavaScript to determine if someone is using a 32 bit or 64 bit processor。 You can see the code here on GitHub.

【讨论】:

您对最后一点不正确,这并不意味着用户拥有 32-but windows 机器。事实上,以上所有内容只是为您提供浏览器信息,而不是操作系统。【参考方案8】:

我将上面漂亮搜索的结果恢复到这些 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" ) );

谢谢大家!

【讨论】:

【参考方案9】:

我使用了以下代码:

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 获取该信息 :(。不过,还有一个技巧可以在那里完成。因为 Adob​​e 在 x64 浏览器上不支持 Flash 播放器,您可以尝试检测它。如果检测成功,肯定是 32 位浏览器,如果不是,那是没有 flash 插件的 32 位浏览器或者是 64 位浏览器。因为 Flash 播放器的渗透率非常大(见http://www.adobe.com/products/player_census/flashplayer/version_penetration.html),这应该足够好,至少可以检测到Mac下的x32浏览器。

【讨论】:

【参考方案10】:

适用于任何 Internet Explorer 浏览器的 64 位 Windows 上的 64 位 IE

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


【讨论】:

【参考方案11】:

window.navigator.cpuClass 和 window.navigator.platform 都返回浏览器平台。不是系统平台。因此,如果您在 64 位系统上运行 32 位浏览器,那么这两个变量都将返回 32 位。这是不正确的。

【讨论】:

【参考方案12】:

我发现了这个老问题,并想用我发现的最近的开源库进行更新: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

【讨论】:

以上是关于从用户代理或 Javascript 检测 64 位或 32 位 Windows?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript 检测 iPad 应用内浏览器用户代理

通过 Javascript 检测 Apple Watch(例如,用户代理)

JavaScript用户代理字符串检测脚本

javascript 检测用户代理IE

javascript浏览器用户代理检测脚本实现

如何从 php 中的用户代理字符串中检测浏览器欺骗和机器人