首页 > 解决方案 > Node-Windows - 在登录屏幕上运行 GUI 应用程序

问题描述

我需要在 Windows 7 到 10 的登录屏幕上运行 GUI 应用程序。

我有一个使用 node-windows 模块注册为 SYSTEM (默认)运行的服务的 nodejs 应用程序。这似乎是我需要的先决条件,但还需要更多的东西。

该应用程序只是一个连接到套接字服务器的基本套接字客户端,目前还没有什么特别之处。

我在想,如果我使用 child_process.spawn() 打开提升的命令提示符和/或作为另一个用户运行 - 但什么用户?系统不这样做。我在想无论 winlogon.exe 以何种方式运行,但这似乎不是 SYSTEM,即使它在任务管理器中显示的是它。

如果您具有系统级访问权限,是否有 Windows 命令可以在登录屏幕中运行 GUI?

更新:

好的。到目前为止,我有一个类似 telnet 的反向客户端作为 SYSTEM 用户下的 Windows 服务在“远程主机”上运行。它定期连接到测试服务器文本界面(也是节点),您可以从中输入 nodejs 命令——基本上是自制的 JS REPL。

我能够在会话 0 下生成一个隐藏的交互式 Windows 命令提示符,键入命令并通过我的小反向命令行终端获取输出。

Obvi,加密和安全性在这里很重要,但是现在 Windows 在我笔记本电脑上 Linux 内的 VM 中运行,并且应用程序仅通过仅主机虚拟网络上的私有 NIC 相互通信,因此数据包是不会溢出到真实的网络上。

在会话 0 中的 Windows 命令提示符下,我尝试运行我的远程控制 GUI 应用程序。我没有看到 GUI,而是收到以下错误:

[5472:5492:0828/031356.901:ERROR:gpu_process_transport_factory.cc(1024)] 丢失 UI 共享上下文。

如果我tasklist,我会得到:

winlogon.exe 2140 控制台 3 6,704 K 未知 NT AUTHORITY\SYSTEM 0:00:00 N/A
LogonUI.exe 4772 控制台 3 19,104 K 未知 NT AUTHORITY\SYSTEM 0:00:00 N/A

所以,我可以看到 winlogon.exe 和 LogonUI.exe 在会话 3 中作为用户“SYSTEM”运行。

如何将服务放在 winlogon 和 logonui 的 GUI 上下文中,或在其中生成我的应用程序?

是否有 Windows 命令可以执行此操作?一个nodejs命令/模块/函数?

更多信息:

它需要是一个程序化的、可自动化的解决方案,我可以在程序中工作——无需使用另一个 GUI 应用程序进行手动调整来使其工作。

但是,注册表编辑或任何可通过节点或 Windows 控制台命令完成的操作都应该是可以接受的,因为我可以将它们合并到我的代码中。

背景:这主要是为了运行我编写的远程桌面应用程序,很像 Screen-Connect 或 LogMeIn。它工作得很好——除了在你调用任何调用 UAC 或进入登录屏幕时它会暂停的部分,这使得它对于远程 IT 工作尚不实用。

nodejs Windows 服务应用程序也可以很好地工作,在启动时作为服务自动启动,自动连接/重新连接到测试服务器,无需登录或持续连接,并且持续保持活动状态。

基本上我在想,如果我可以在登录屏幕中运行它的一个实例,它应该能够抓取桌面视频捕获以输出到网络,并从网络调用远程鼠标和键盘输入。

桌面捕获是使用 NW.js 和在远程主机上运行的 child_process.spawn()ed 基于机器人的套接字客户端完成的。

不幸的是,在服务应用程序中植入robotjs不起作用——我试过了,因为我至少在想我可以在控制器应用程序中有一个自定义的远程登录屏幕,并让robotjs在远程电脑的登录屏幕中输入密码——但没有运气。看来我只获得了旧版 Desktop 0,而不是基于robotjs 的键盘/鼠标输入的登录屏幕。

我真的希望我所需要的只是“运行”其他一些用户或进程。**注意:我正在寻找一种不涉及自动登录、重新启动或解决方法的方法。我知道微软已经正式支持完成这些任务的方法——但我还没有找到一种通过 Node 而不是 C 来完成的方法。如果有一个使用本机代码的节点模块来完成它,那对我来说很好。我只希望我的代码是 JavaScript。

无论如何,这就是我问这个问题的实际目标——在登录屏幕上运行我的远程桌面应用程序以获取视频并调用鼠标操作和击键。

如果有更好的方法与标题中的问题不匹配,请回答,如果可行,我将编辑问题以匹配答案。

标签: node.jswindowsauthenticationnwjsrobotjs

解决方案


答案是'paexec'。psexec 的工作原理完全相同,但 paexec 是开源的、可自由分发的,并且可在您的个人和商业应用程序的应用程序中使用。


要求:

下载 paexec.exe 。

将其放在您可以执行的位置,或 cd 到您放入的文件夹,或将其放在命令路径中,或将您放入的文件夹添加到命令路径,或通过路径名引用它(即 c:\folder \subfolder\paexec -your_options)。


推荐的:

从 Windows 服务(在我的例子中是 npm node-windows 服务)执行此操作。这允许您以 SYSTEM 身份运行它。还有其他方法,但这种方法似乎效果最好。


示例使用:

paexec -d -s -x -w c:\path\to\your\app_folder cmd /c app.exe -your_options

这是如何工作的:

-d 防止 paexec 等待应用程序退出,因此允许非阻塞。

-s 以 SYSTEM 用户身份执行。

-x 使其在登录屏幕上运行

-w 设置当前工作目录

cmd /c yourappname.exe 允许您使用以前的选项运行 GUI 交互式应用程序(如果不先打开提示,它似乎不起作用)。


补充注意事项:

使用 'cmd /c',您可以调用 .bat 或 .cmd 脚本并使用 'start /b your_app.exe' 使 cmd.exe 窗口消失(否则您会一直停留在登录屏幕上,直到您关闭它或您的应用程序)。

您的应用程序将在登录后继续运行,但它不会在用户登录会话中运行,因此如果您希望您的应用程序同时执行这两项操作,我建议使用 'taskkill /f /im your_app.exe' 或其他方式停止in 然后在用户登录会话上运行。

您可以通过以下方式在用户的桌面会话上运行它:

paexec -d -s -i 1 -w... (the rest is the same as above).

...假设只有一个用户登录,他们将在会话 1 上。这就是“-i 1”选项的作用,在会话 1 上运行它。如果有多个用户登录(即通过切换用户等)他们可能有不同的会话编号,因此只需将“-i 1”替换为“-i x”,其中“x”是用户会话 ID。

您可以通过 Windows 命令“tasklist /v”查找会话 ID。

如果您尝试从 node.js 服务运行它,您将需要使用 process_child 内置模块并生成一个 cmd 提示符来运行它。这方面的例子很多,这里就不一一赘述了。从 Windows 服务运行它的好处是它不会打开可见窗口,您可以通过标准 child_process.spawn() 方法和事件提供 i/o。


安全:

从 Windows 服务(即通过 node-windows 和 child_process.spawn)运行它允许您不仅在登录屏幕上运行您的 GUI 应用程序,而且在登录前的引导时运行,无论是否使用 GUI —— 没有任何典型的不安全hacks,比如自动登录到一个特殊的用户帐户然后锁定屏幕或注销等。它实际上是使用一个镜像 MicroSoft/SysInternals 自己的工具的工具,在 MS 的官方规定的方法下执行此操作。

这里的弱点只是你的应用程序,所以按下它并确保安全!


注意:Obvi 这是一个复杂的问题,这可能就是为什么似乎没有任何好的答案的原因 - 并且可能已经弄清楚的少数人不想分享。所以给你。

享受!


PS:你可能真的很邪恶请不要将其用于邪恶目的。 这正是他们让事情变得如此困难的原因。做个好人,这样我们都可以从它的力量中受益。


除了关于任务名称:

如果您希望引用您的节点或 nw.js 应用程序,并在任务列表和任务管理器中将其视为 yourappname.exe,您只需将 node.exe 和 nw.exe 可执行文件重命名为您希望它们显示的任何内容(即将 nw.exe 重命名为 myapp.exe,它将显示并在 Windows 中称为 myapp.exe)。这是假设您的应用程序文件夹中有 node.exe 等的本地副本...不要对全局安装的可执行文件执行此操作!


还有一件事:

如果有人有更好的,经过验证的方法,请将其添加为答案!

如果它对我有用,我很乐意不接受我的回答并接受你的回答!!


推荐阅读