【问题标题】:os.startfile() using RDCos.startfile() 使用 RDC
【发布时间】:2014-09-15 08:41:19
【问题描述】:

我的 windows box 上运行着一个cherrypy 服务器。它处理在默认编辑器中打开文件的请求。 (请求只包含文件路径)

当两个用户登录到同一个 Windows 服务器(使用 RDC)时,对于第二个用户发出的打开文件请求,cherrypy 在第一个用户的桌面上打开文件(因为第一个用户启动了cherrypy 服务器)

有解决办法吗?我可以在调用 os.startfile() 时附带用户信息,以便在第二个用户桌面中打开文件吗?

【问题讨论】:

  • 首先,你需要的不仅仅是用户信息,还有session信息。一个用户可能没有当前的 RDC 会话,或者有 3 个不同的会话;你如何决定在哪一个打开它?

标签: python remote-desktop remote-server os.system


【解决方案1】:

简短的回答是:不容易。

正如os.startfile 的文档所暗示的那样,它只是调用ShellExecute,它没有这样的功能。

可以做的很容易就是让每个用户在他想要的任何会话上用他自己的帐户启动他自己的网络服务器副本。当然,这意味着你们都必须使用不同的端口号(或者在登录时分配随机端口号,然后必须以某种方式显示),但这并不是那么糟糕。


首先,您需要直接与 Win32 API 对话(最好通过pywin32,但如果您真的想使用ctypes,您也可以)。

接下来,用户可能已连接到您的 Web 服务器,但未连接到 RDC 服务器,或者更糟糕的是,可能有三个不同的 RDC 会话。那么,“第二个用户的桌面”究竟是什么意思呢?如果可以任意选择一个,如果没有则失败,这是一个合理的答案。这部分非常简单:您使用Windows Terminal Server API(现在是远程桌面服务的一部分,但大多数功能仍以 WTS 开头)枚举会话并找到WTS_SESSION_INFO_1 与您的用户匹配的第一个会话。

现在,您只需在该会话中为该用户获取访问令牌或模拟令牌,以便您可以调用 CreateProcessAsUserCreateProcessWithToken。 (您不能使用CreateProcessWithLogon,因为这不会在他们的 RDS 会话中,它将在该用户的新会话中,但会连接到您的 RDS 会话,这是双重无用的。)

那么,你如何获得其中的一件?在这里,您可以选择一个巨大的安全漏洞(如果您不是很小心并且不知道自己在做什么),或者另一个巨大的安全漏洞(如果您不是很小心并且不知道是什么)你在做。

如果您不担心终端服务器被黑客入侵,您可以以LocalSystem 的身份运行您的服务器(或者,希望是与您的服务器通信的最小帮助工具),并调用WTSQueryUserToken。这个其实很简单,只要读到这句话,你的电脑就成为了某人的垃圾邮件僵尸网络的一部分。

如果您不关心用户的帐户被黑客入侵,您可以通过您的网络服务器传递他们的凭据,以便您可以登录并ImpersonateLoggedOnUser 获取用户令牌。有一些方法可以在不通过网络以明文形式传递密码的情况下做到这一点,但这并不重要。因为下一步是创建一个连接到用户现有会话的新会话,并且要从外部执行此操作,所以即使您已经以他的身份登录,您也需要他的用户名和密码。无论如何,完成之后,您只需在新会话中运行该应用程序,他就会在他现有的会话中看到它,然后每个人都过着幸福的生活,尤其是刚刚检查您的朋友使用与他相同的 PayPal 密码的人为您的服务器支付了价值 17000 美元的费用。

如果这还没有吓到您,请在未连接到 Internet 的 LAN 上创建一些虚拟机并开始玩这些东西 - 这很有趣,而且您会学到很多东西,而且理想情况下你将能够编写出你想要的东西,并最终让自己充分相信你不会在任何你准备部署它的地方泄露令牌。

【讨论】:

  • 我正在从浏览器 javascript 发送请求。我无权访问“Windows 终端服务器 API”
  • @Vink:很明显,JavaScript 代码无法访问 WTS API,但它也无法访问 os.startfile,所以我假设您在问如何制作您的 @ 987654340@ server 代表他们完成工作。该服务器当然可以访问您想要提供的任何内容。
猜你喜欢
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多