背景:我们有软件可以(远程)从 Windows 桌面检索信息。桌面需要锁定,但如果我们以简单的方式锁定,Windows 会认为没有人在看屏幕并停止更新。为了防止这种情况,我们打开了与计算机的 RDP 会话。这会锁定屏幕,但原始桌面仍会更新。
我们有一个小程序(称为“lockscreen”),基于远程桌面 Active X 控件来打开 RDP 会话。从这个问题的所有意图和目的来看,它的行为似乎与 Microsoft Terminal Services Client (mstsc.exe) 一样。下面描述的任何行为都适用于 lockscreen 和 mstsc。所有结果均来自 Windows 7 计算机。
在目标计算机上运行该程序,当尝试连接到目标计算机(localhost)时,会出现错误“您的计算机无法连接到远程计算机上的另一个控制台会话,因为您已经有一个正在进行的控制台会话”(错误代码 1800)。无论我使用“localhost”、127.0.0.1、目标计算机的名称还是 IP 地址,都会发生这种情况。它似乎是远程桌面 Active X 控件中的一个检查,可以通过使用 IP 地址 127.0.0.2 访问本地计算机来绕过它。使用 127.0.0.2 确实允许连接继续并尝试登录。但是,远程桌面只显示“访问被拒绝”和一个确定按钮。按下按钮或等待一分钟会导致会话断开连接。
我无法找出出现此“拒绝访问”错误的原因。事件日志中没有任何条目可以解释这一点。只有在尝试从目标计算机本身进行连接时才会发生这种情况:从另一台计算机进行连接会成功。
我做了一些实验:当尝试从另一台计算机连接但通过目标计算机上运行的代理时,它会成功 - 无论代理连接到 localhost 还是 127.0.0.2。当从目标计算机连接时,通过相同的代理,它会失败,无论代理连接到 localhost 还是 127.0.0.2。似乎只有设置连接的程序的位置是相关的。
在上述所有情况下,FreeRDP 都能成功连接。显然不存在身份验证或授权问题,或任何其他会阻止建立连接的基本问题。
我有两个问题:为什么在从一台计算机到其自身设置 RDP 会话时访问被拒绝?我能做些什么吗?
答案1
连接到在本地主机(或 IP 127.0.0.1)上运行的终端服务器服务,导致会话断开或无法连接。此行为已由 Microsoft 明确嵌入到 RDP 中,其原因已随着时间而消失。
以下是一些绕过该限制的解决方法。如您所见,将其放入 RDP 中的 Microsoft 开发人员并没有付出任何努力。这些解决方法可能仍然适用于最新的 Windows 10,但我尚未测试过。
将远程桌面连接连接到
127.0.0.2
,它是 的别名127.0.0.1
。连接非标准端口,而非默认端口(3389)。
mstsc.exe
以另一个操作系统的形式模拟运行。这需要将和
复制到新文件夹,右键单击复制的,选择“属性”、“兼容性”选项卡,然后勾选“Windows 98 / Windows Me”的“以兼容模式运行此程序”。C:\Windows\System32
mstsc.exe
mstscax.dll
mstsc.exe
请注意,在远程桌面会话中登录时,请以其他用户的身份进行登录,否则您可能会强制退出。
答案2
我的问题是它在什么服务下运行?如果您能够让它在系统下执行,它应该会继续运行,无论屏幕是否锁定或是否有人登录。我必须为 SharePoint 自动化和一些脚本执行此操作,这样最终用户就永远不会看到它,没有人必须登录等,并且 gpo 会在系统重新启动时启动。
抱歉,需要澄清的是,您的应用程序。不是 rdp。您在系统上用于数据收集的应用程序/软件。您的问题在于它在哪个帐户/服务下执行。有很多商业应用程序可以从您的计算机上抓取数据,无论计算机上是否有人,都无需 rdp 连接来欺骗系统。大多数这些应用程序都在计算机系统帐户下执行。
答案3
这确实按设计工作。通常,由于环回,您无法向同一台计算机发起 RDP 会话。
可以修补终端服务 .dll 文件以允许这样做,但这不是一个好的解决方案,因为每次 Windows 更新时,它都会中断,并且必须再次应用补丁,这很困难,因为您必须搜索新版本文件的补丁。
我会研究桌面需要锁定的原因。也许你可以调整一下,让机器实际上没有被锁定,或者锁定方式不同。
例如,您可以选择切换到其他用户。第一个用户仍在后台以“锁定”状态运行,但可能仍处于适合您的状态。另一个用户处于不同的状态,您可以测试锁定该用户,甚至注销。