os.startfile()使用RDC

时间:2014-07-23 23:32:39

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

我的Windows机器上运行了一台樱桃服务器。它处理在默认编辑器中打开文件的请求。 (请求只包含文件路径)

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

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

1 个答案:

答案 0 :(得分:1)

简短的回答是:不容易。

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

可以轻松完成的工作就是让每个用户在他自己的帐户下,在他想要的任何会话中启动他自己的Web服务器副本。当然,这意味着你们都必须使用不同的端口号(或者在登录时获得指定的随机端口号,然后你必须以某种方式显示),但这并不是那么糟糕。


首先,您需要直接与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美元的费用。

如果这还没有让你害怕,请在没有连接到互联网的局域网上创建一些虚拟机并开始玩这些东西 - 这很有趣,你会学到很多东西,理想情况下你将能够写出符合你想要的东西,并最终充分说服你自己在你准备好部署它的任何地方都没有泄漏令牌。