【问题标题】:How to detect, from browser, if user is running in Remote Desktop session?如何从浏览器检测用户是否在远程桌面会话中运行?
【发布时间】:2010-08-05 18:25:45
【问题描述】:

如果用户在远程桌面会话中运行,有没有办法检查浏览器(例如 javascript)?


如果用户在远程桌面(即终端服务)中运行浏览器,我想禁用网站上的动画。

如果这是一个本机应用程序,而不是一个网站,我可以使用以下方法执行此检查:

//Native code
isRemoteSession = GetSystemMetrics( SM_REMOTESESSION );

//Managed Code:
isRemoteSession = System.Windows.Forms.SystemInformation.TerminalServerSession;

是否有可以在浏览器中进行的类似检查?

注意:假设我们讨论的浏览器是 Internet Explorer 8。


更新一:可能在How can you get the terminal service client machine name from javascript?

【问题讨论】:

  • +1,因为它对许多网站来说是一个很好的可用性增强。

标签: windows terminal-services


【解决方案1】:

我的解决方案是使用 CSS @media 查询 color media feature 的最小值和最大值。根据实验,RDP 似乎每种颜色只有 5 位,而不是典型桌面的每种颜色全部 8 位。

当然,这种解决方案并不完美,因为您会从不使用 RDP 的人那里得到很多误报,但只是碰巧有低色深显示器。然而:

  • 如果您处于企业内部网等相对受控的环境中,您可能会对“低色深”=“RDP”更有信心。
  • 网页上许多需要针对 RDP 进行调整的视觉元素,需要精确调整,因为颜色深度较低(渐变、淡出、动画等),等等实际上测试颜色深度而不是 RDP 本身是有意义的。

这是一个适用于我最近版本的 Firefox 和 Chrome 的示例。请参阅下面的屏幕截图。

<!DOCTYPE html>
<html>
    <head>
        <title>Test RDP detection</title>
        <style type="text/css">
            @media all { li.color { display: none; } }
            @media all and (min-color: 1) { li.color.color-depth-1 { display: block; } }
            @media all and (min-color: 2) { li.color.color-depth-2 { display: block; } }
            @media all and (min-color: 3) { li.color.color-depth-3 { display: block; } }
            @media all and (min-color: 4) { li.color.color-depth-4 { display: block; } }
            @media all and (min-color: 5) { li.color.color-depth-5 { display: block; } }
            @media all and (min-color: 6) { li.color.color-depth-6 { display: block; } }
            @media all and (min-color: 7) { li.color.color-depth-7 { display: block; } }
            @media all and (min-color: 8) { li.color.color-depth-8 { display: block; } }

            /* 5 bits per color seems to be the max for RDP */
            @media all and (max-color: 5) {
                .not-rdp { display: none; }
            }
            @media all and (min-color: 6) {
                .rdp-only { display: none; }
            }
        </style>
    </head>
    <body>
        <p>This page uses CSS <tt>@media</tt> queries to detect whether you
            are viewing it over RDP&mdash;heuristically, by looking at the
            color depth of your display.</p>

        <ul>
            <li class="color color-depth-1">Your display is not monochrome!</li>
            <li class="color color-depth-2">Your display has at least 2 bits per color.</li>
            <li class="color color-depth-3">Your display has at least 3 bits per color.</li>
            <li class="color color-depth-4">Your display has at least 4 bits per color.</li>
            <li class="color color-depth-5">Your display has at least 5 bits per color.</li>
            <li class="color color-depth-6">Your display has at least 6 bits per color.</li>
            <li class="color color-depth-7">Your display has at least 7 bits per color.</li>
            <li class="color color-depth-8">Your display has at least 8 bits per color.</li>
        </ul>

        <p>You are <span class="not-rdp">not</span> using RDP.</p>
        <p class="rdp-only">This is only visible over RDP.</p>
    </body>
</html>

沿着这些思路的另一种方法是使用 javascript 检查screen.colorDepth 变量的值。

【讨论】:

  • 请注意,颜色深度可在 RDP 客户端中配置:请参阅 Advanced/Display/Colors 下拉菜单。
  • 刚刚为此创建了一个小提琴供人们快速测试:jsfiddle.net/7cqqpeqe - 不过似乎不再作为一种方法工作了。
  • 这似乎在 Chrome 中不起作用,但至少在 Firefox 中起作用。还有一个 javascript 函数来测试颜色深度:w3schools.com/jsref/…
  • 有人成功复制了这些结果吗?
【解决方案2】:

您可以使用以下媒体查询:

@media screen and (prefers-reduced-motion: reduce) { . . . }

此条件也适用于非 RDP 会话,但由于您的意图是禁用所有动画,因此这种类型的查询可能正是您正在寻找的。​​p>

【讨论】:

  • 测试它并且它工作。在 RDP 会话中,Chrome 83 使用 reduce。即使您打开所有视觉体验效果,包括菜单和窗口动画,它也会打开reduce。但是 Internet Explorer 11 和 Edge 没有设置。
  • @IanBoyd 这种方法还能用吗?我试图在没有任何运气的情况下复制结果。
  • @CodeSamurai777 它仍然可以工作MDN example(Chrome 85,Edge 85)
  • @IanBoyd 请问您在哪种 RDP 会话上进行了测试?我尝试过 TeamViewer 和 Windows RDP,但运气不佳。
  • @CodeSamurai777 在使用 RDP 从家里连接到我的工作 PC 时浏览到该页面。
【解决方案3】:

如果您使用 IE,您可能可以通过 ActiveX 或 BHO(例如assign a property to the window object in BHO)公开检测代码。

否则如果您使用ActiveX播放器播放动画,请查看播放器的文档,看看它是否在远程桌面下自动调整帧率。

如果视频播放不满意,您始终可以提供低带宽版本的网站,并指导用户选择网站而不是常规网站。

有关编写终端服务感知图形应用程序的提示,请查看graphic effects considerationgeneral performance guidelines

【讨论】:

  • “让用户选择低带宽版本”是正确答案。
  • Ben,不是真的,因为这仍然需要加载一次页面才能选择。此外,所需的带宽并不是 RDP 的真正问题,它是动画、大图像等,因为这些使通过 RDP 导航站点几乎无法使用(因为显示更新会干扰交互)。
【解决方案4】:

也许您可以读取 SESSIONNAME 环境变量? 对于控制台会话,它应该是 CONSOLE,对于 RDP 会话,它应该是 RDP-TCP,后跟一个数字。

【讨论】:

  • 在浏览器中使用客户端 Javascript 读取环境变量?我对此表示怀疑。
【解决方案5】:

我假设您在谈论特定的公司终端服务器,而不是任何终端服务器。您无法向 TS 的特定 IP 地址提供动画。

【讨论】:

  • 不,任何终端服务器。如果您从工作中 RDP 到您的家用计算机,然后浏览我的网页:动画不应该播放。
【解决方案6】:

这不应由您的应用程序完成或决定。在 RDP 客户端(如 MS RDC)上,用户可以选择禁用动画等。用户也可以在服务器端(终端服务器或 RDP 主机)禁用这些

【讨论】:

  • RDP 连接性能选项(如动画、壁纸等)不会暴露给浏览器内的应用程序,无论 RDP 设置如何,浏览器都会呈现 CSS/JavaScript 动画。直到有一个 API 被公开来查看是否应该在 web 应用程序中禁用动画和其他功能,我们所能做的就是检测环境的小技巧。
猜你喜欢
  • 2011-12-25
  • 2016-10-17
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多