在远程计算机上执行命令并显示UI以login用户

因为我在网上找不到任何适当的解决scheme,我会在这里问。

我有一堆电脑,我想要执行一个程序,并显示程序GUI到当前login的用户。 Afaik这是不可能与Powershell(停止/启动的Windows服务是没有问题的),我无法设法得到这与PsExec.exe完成。

我的PsExec命令看起来像这样 – calc.exe在TaskManager中可见,但是我看不到GUI。

C:\Users\Administrator.DEV\Desktop>PsExec.exe -i \\TEST-CLI-01 -u localUser -p userPassword -d calc.exe 

简短设置说明:服务器:MS Server2012R2客户端:Windows 8.1每个系统都是AD域的一部分。

任何人都有一个想法,我怎么能做到这一点?

Thx很多提前:)

你会发现这是非常困难的,如果不是不可能的话。 你会认为这很容易,但事实并非如此。 微软已经做了这个有目的的困难,因为如果你可以在另一个用户的安全上下文中操纵窗口pipe理器,它会暴露一种安全漏洞(“粉碎”的攻击)。

Windows Vista中引入的会话0隔离function使服务程序(如PsExec )难以与控制台交互。 当Interactive Services Detection服务运行时,当服务试图与控制台交互时,会提示用户切换到安全桌面以与服务的GUI进行交互。

有一些关于Stackoverflow的讨论可以深入到体系结构的细节中。

处理这个问题的一个更好的方法是让用户运行一个进程监听某种types的进程间通信并相应地执行。 如果你想得到真正的,真正的黑客,你可以运行一个简单的VBScript或Powershell脚本,坐在后台,当用户login,并等待文件/registry项/ TCP连接/等,然后采取行动。 你可以把这样的东西拼凑在一起,作为一个概念validation很快。

正如埃文所说,这是有目的地做成很难做到的,因为它很容易被恶意利用和利用。

但是,如果你有足够的奉献精神,并且愿意让自己的手变脏,那么你可以做到。

我创build了一个非常健壮,可靠的Windows服务,在生产环境中的计算机上运行,​​在特定条件下在login用户的安全上下文中执行GUI应用程序,以便应用程序恰好出现在用户眼前…所以,我的这一点是有可能以一个强大和可靠的方式做到这一点。

关键是Advapi32.dll的CreateProcessAsUser API函数 。

而为了使用该function,您必须能够“窃取”login用户的主要访问令牌。 为此,您可以使用Wtsapi32.dll中的WTSQueryUserToken API函数 。

使用上述API的一个限制是它只能从本地系统的安全上下文中调用 – 这就是为什么PsExec.exe -si 2 \\Test-CLI-01 calc.exe适合你的原因 -因为那里的-s开关告诉PsExec以本地系统运行。

这很自然就是当你的Windows服务以本地系统的forms执行的时候,因为如果你想使用WTSQueryUserToken话就需要它。 我们要说的是,将程序或服务作为本地系统来运行通常是一个坏主意,因为本地系统无限制地访问正在执行的机器,所以如果黑客利用程序中的缺陷,他或她可以使用利用这些漏洞使您的代码采取本地系统安全上下文赋予的所有安全特权进行一些操作。 (即所有这些)

这也是程序员必须非常小心的地方,因为你有责任处理这些安全令牌,而不是泄漏它们。 如果处理不当,你(或一个坏的演员)显然可能会将这些安全令牌用于恶意目的。

一些有用的例子,取自我刚才写的一些C#

获取用户的主访问令牌:

 WTSQueryUserToken((uint)session.SessionId, out userPrimaryAccessToken) 

使用该主访问令牌在其会话中启动进程,如同该用户:

 CreateProcessAsUser(userPrimaryAccessToken, null, cmdLine, ref saProcessAttributes, ref saThreadAttributes, false, 0, IntPtr.Zero, null, ref si, out pi) 

这些只是Windows API调用…你可以用你想要的任何语言复制它。

thx为你提示和提示 – 我做的是以下

 function startChromeRemotely($client) { $desktopSession = query user /server:$client | Select-String -Pattern Active $desktopSessionId = ($desktopSession -split '\s+')[3] .\PsExec.exe -i $desktopSessionId -d \\$client -u someuser-p somepassword "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" } 

所以基本上我所做的就是首先获取login(“主动”)用户的桌面会话,然后直接将chrome屏幕“注入”用户会话。 如果作为域pipe理员执行这似乎工作正常,但不知何故,感觉奇怪/不稳定。 有人能告诉我为什么吗?

Thx再次:)