【问题标题】:Detect from browser if specific application is installed从浏览器检测是否安装了特定应用程序
【发布时间】:2010-09-22 10:41:38
【问题描述】:

我们有一个高级网页(ASP.NET、C#)和一个需要安装在客户端计算机上的应用程序,以便充分利用该网页。该应用程序是一个托盘应用程序,主要有两个任务。检测网络服务器上何时发生某些事件(例如,受邀参加会议,或通知即将举行的会议)。 Trayapp 的另一项任务是使用自定义协议 (trayapp://) 执行一些 ajax 调用返回到服务器。

我们遇到的一个问题是如何确定应用程序是否安装在本地机器上。现在用户必须勾选一个复选框来通知网站应用程序已安装,并且可以安全地调用trayapp:// url 调用。

有什么方法,例如通过 JavaScript 或类似的方法来检测我们的应用程序是否安装在本地机器上?

该检查需要适用于 IE、FF 和 Opera 浏览器。

【问题讨论】:

    标签: asp.net javascript ajax web-applications


    【解决方案1】:

    安装客户端应用程序时,您可以修改浏览器配置以在 HTTP 请求中包含另一个请求标头,然后让服务器代码查找该标头,例如使用以下注册表项作为受支持的 mime 类型(对于 Internet探险家)

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
                                                          Internet Settings\Accepted Documents
    

    我不确定 Opera 和 FF 是否使用相同的密钥,但它们可能具有相似的配置选项,但这至少应该让您走上正轨。

    【讨论】:

    • 我对这种方法非常感兴趣,但找不到任何明确的说明。你有一个如何跨浏览器设置的例子吗?
    【解决方案2】:

    如果您想在浏览器中使用 javascript 进行检测,您可能可以使用集合“navigator.plugins”。它适用于 Firefox、Opera 和 Chrome,但不幸的是不适用于 IE。

    更新: 在 FF、Opera 和 Chrome 中,您可以像这样轻松测试它:

    if (navigator.plugins["Adobe Acrobat"]) {
    // do some stuff if it is installed
    } else {
    // do some other stuff if its not installed
    }
    

    更新 #2: 如果它是 IE 中的 ActiveX 对象,您可以使用以下方法测试它是否存在:

    function getActiveXObject(name){
            try{
                return new ActiveXObject(name);
            }
            catch(err){
                return undefined;
            }
    };
    

    IE 的另一种方法类似于 JohnFx 建议的方法(我发现它here 并没有测试它):

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\Internet
    Settings\User Agent\Post Platform
    

    【讨论】:

    • 也许在 IE 中,他也可以从 javascript 中尝试注册 ActiveX 的 CreateObject() 来检查应用程序是否已安装
    【解决方案3】:

    好吧,“some”提到的方法非常常见,但还有其他方法,例如,如果应用程序正在本地侦听端口,则可以从浏览器中检测到,这对于安全解决方案来说非常常见,因为有某种类型本地代理过滤流量。实际上,我前段时间制作了一个关于使用这种技术检测 avast 杀毒软件的视频,您可以在这里观看:

    https://www.youtube.com/watch?v=39_Nd8oiEAk

    【讨论】:

    • 这看起来是个好主意。托盘应用程序如何侦听端口并处理请求?
    • 它可以简单地打开一个特定端口上的套接字并提供一个图像,如果你可以加载图像然后应用程序就在那里。它还可以用 json 响应并允许某个域读取该 json。
    • 谢谢。看起来HttpListener 类在这里也可能有用。
    【解决方案4】:

    @JohnFx 的好主意。

    解决此问题的另一种方法是安装一个 ActiveX 控件或浏览器插件和托盘应用程序安装。然后,您可以通过与检查可用 Flash 版本时类似的方式访问它。

    【讨论】:

      【解决方案5】:

      将托盘应用程序(假设这是托管应用程序)公开为 COM 对象。然后,您可以使用带有 GUID 的标签并在未找到时捕获错误,或者使用带有 progid 的 ActiveXobject 来检测它是否已安装。

      【讨论】:

        猜你喜欢
        • 2018-12-28
        • 2011-11-26
        • 2019-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        相关资源
        最近更新 更多