如何从浏览器检测用户是否在远程桌面会话中运行?

时间:2010-08-05 18:25:45

标签: windows terminal-services

如果用户在远程桌面会话中运行,是否有办法检查浏览器内部(例如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?

中的内容

6 个答案:

答案 0 :(得分:10)

我的解决方案是使用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>

screenshot showing test page with and without RDP

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

答案 1 :(得分:2)

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

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

这种情况也适用于非RDP会话,但是由于您打算禁用所有动画,因此这种查询可能正是您要查找的。

答案 2 :(得分:1)

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

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

如果视频播放效果不理想,您可以随时提供网站的低带宽版本,并指示用户选择网站而不是常规网站。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:-2)

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