Node-Windows - 运行 登录屏幕上的 GUI 应用程序

Node-Windows - Run GUI app on Logon screen

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

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

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

我在想,如果我使用 child_process.spawn() 打开提升的 command-prompt and/or 运行 作为另一个用户——但是什么用户? SYSTEM 不会这样做。我在想 winlogon.exe 运行 是什么,但这似乎不是 SYSTEM,即使它在任务管理器中显示的也是如此。

如果您有 SYSTEM-level 访问权限,登录屏幕中是否有 windows 命令 运行 GUI?

更新:

好的。截至目前,我在 "remote host" 上有一个反向 telnet-like 客户端 运行ning 作为 SYSTEM 用户下的 Windows 服务。它定期连接到测试服务器文本界面(也是节点),您可以从中输入 nodejs 命令——基本上是一个 home-brew JS REPL。

我能够在 Session 0 下生成一个隐藏的交互式 windows 命令提示符,键入命令并通过我的小反向 command-line 终端获得输出。

显然,加密和安全在这里很重要,但目前 Windows 运行 在我笔记本电脑 Linux 内的虚拟机中,并且仅应用程序通过 Host-only 虚拟网络上的专用 NIC 相互通信,因此数据包不会溢出到真实网络。

在 Session 0 中的 windows 命令提示符处,我尝试 运行 连接我的 remote-control GUI 应用程序。我没有收到 GUI,而是收到以下错误:

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

如果我 任务列表,我得到:

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 在 session 3 中 运行ning 作为用户 'SYSTEM'。

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

是否有 windows 命令来执行此操作?一个 nodejs command/module/function?

更多信息:

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

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

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

nodejs windows 服务应用程序也可以正常工作,在启动时作为服务自动启动,autoconnects/reconnects 到测试服务器无需登录或连续连接,并持续保持活动状态.

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

desktop-capture 是使用 NW.js 和 child_process.spawn()ed robotjs-based socket-client 运行ning 在远程主机上完成的。

不幸的是,在服务应用程序中植入 robotjs 是行不通的——我试过了,因为我想至少我可以在 controller-app 中有一个自定义的远程登录屏幕,并让 robotjs 输入远程电脑登录屏幕中的密码——但没有运气。看来我只得到旧版桌面 0,而不是 robotjs-based keyboard/mouse 输入的登录屏幕。

我真的希望我所需要的只是 'runas' 一些其他用户或进程。 **注意:我正在寻找一种不涉及 auto-logon、重新启动或解决方法的方法。我知道 MicroSoft 已经正式支持完成此类任务的方法——但我还没有找到一种方法来通过 Node 而不是 C 来完成它。如果有 node-module 使用本机代码来完成它,那对我来说很好。我只希望 my 代码为 JavaScript.

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

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

答案是'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 window 消失(否则您会卡住它会出现在您的登录屏幕上,直到您关闭它或您的应用程序。

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

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

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 内置模块和 spawn cmd 提示 运行 它来自。有很多这样的例子,所以这里不解决这个问题。 运行 从 Windows 服务中获取它的好处是它不会打开可见的 window,您可以通过标准 child_process.spawn 提供 i/o () 方法和事件。


安全:

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

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


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

尽情享受吧!


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


旁白关于任务名称:

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


还有一件事:

如果有人有更好的、久经考验的方法,请添加为答案!

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

非常感谢您分享您的发现!这是另一篇可能对其他人有帮助的文章:

如果您不想制作单独的应用程序来启动服务,您可以使用 NSSM (https://nssm.cc/)。下载它并 运行 以下内容以创建服务:

nssm install your-app-name c:\tmp\paexec.exe -s -x -w c:\path\to\your\app_folder cmd /c app.exe -your_options

然后,启动服务将以阻塞模式启动 paexec(因此,如果服务是 运行ning,paexec 是 运行ning,因此,您的应用程序是 运行ning),具有与 jdmayfield 的精彩答案相同的标志。

如果有人对如何在 Windows 上进行远程桌面访问而无需在服务会话和用户会话之间切换有任何建议,请分享!