Python 使用RDC的os.startfile()

Python 使用RDC的os.startfile(),python,remote-desktop,remote-server,os.system,Python,Remote Desktop,Remote Server,Os.system,我有一个cherrypy服务器在我的windows机器上运行。它处理在默认编辑器中打开文件的请求。(请求仅包含文件路径) 当两个用户登录到同一个Windows服务器(使用RDC)时,对于第二个用户发出的打开文件请求,cherrypy将在第一个用户桌面上打开该文件(因为cherrypy服务器是由第一个用户启动的) 有解决办法吗?我可以在调用os.startfile()时附带用户信息,以便在第二个用户桌面中打开该文件吗?简短的回答是:不容易 正如文档所暗示的,它只是调用,没有这样的功能 您可以很容易

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

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


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

简短的回答是:不容易

正如文档所暗示的,它只是调用,没有这样的功能

您可以很容易地做到的是,让每个用户在他想要的任何会话中,以自己的帐户启动自己的web服务器副本。当然,这意味着您必须使用不同的端口号(或者在登录时获得随机端口号,然后您必须以某种方式显示),但这并不可怕


首先,您需要直接与Win32 API对话(理想情况下通过
pywin32
,但是如果您真的想使用
ctypes
,您可以)

接下来,用户可能连接到web服务器,但没有连接到RDC服务器,或者更糟糕的是,可能有三个不同的RDC会话。那么,“第二个用户的桌面”到底是什么意思呢?如果任意选择一个是可以接受的,如果没有选择就失败,这是一个合理的答案。这一部分相当简单:您可以使用(现在是远程桌面服务的一部分,但大多数功能仍然从WTS开始)枚举会话,并找到第一个其
WTS\u SESSION\u INFO\u 1
与您的用户匹配的会话

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

那么,你是如何得到这些东西的呢?在这里,你可以选择一个巨大的安全漏洞,如果你不太小心,不知道自己在做什么,或者另一个巨大的安全漏洞,如果你不太小心,不知道自己在做什么

如果您不关心终端服务器盒被黑客攻击,您可以运行服务器(或者,希望是服务器与之对话的最小帮助工具),作为
LocalSystem
,然后调用。这句话其实很简单,只要读了这句话,你的电脑就成了某人垃圾邮件僵尸网络的一部分

如果您不关心用户的帐户被黑客攻击,您可以通过web服务器传递他们的凭据,这样您就可以登录并获得用户令牌。有一些方法可以做到这一点,而无需通过网络以明文形式传递密码,但这并不重要。因为下一步是创建一个连接到用户现有会话的新会话,并且要从外部执行此操作,您需要他的用户名和密码,即使您已经以他的身份登录。不管怎么说,这样做之后,你只需在新会话中运行应用程序,他就能在现有会话中看到它,从此每个人都过上了幸福的生活,尤其是那个刚刚检查过你的朋友使用了与你的服务器相同的PayPal密码的家伙,他为此支付了17000美元的费用


如果这还没有吓跑你,在没有连接到互联网的局域网上创建一些虚拟机,然后开始玩这些东西。这很有趣,你会学到很多东西,理想情况下,您将能够编写一些您想要的东西,并最终充分说服自己,您不会在任何地方泄漏令牌,您已经准备好部署它。

首先,您需要的不仅仅是用户信息,还有会话信息。一个用户可能没有当前的RDC会话,或者有3个不同的会话;如何决定在哪个浏览器中打开它?我正在从javascript浏览器发送请求。我没有访问“Windows终端服务器API”的权限@Vink:显然JavaScript代码没有访问WTS API的权限,但它也没有访问
os.startfile
的权限,因此我假设您正在询问如何让您的
cherrypy
服务器代表他们完成工作。当然,这个服务器可以访问任何你想给它的东西。