节点Windows-在登录屏幕上运行GUI应用

时间:2018-08-28 04:45:01

标签: node.js windows authentication nwjs robotjs

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

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

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

我在想,如果我使用child_process.spawn()打开提升权限的命令提示符和/或以其他用户身份运行-但是是哪个用户? SYSTEM不会这样做。我在想运行什么winlogon.exe,但这似乎不是SYSTEM,即使这是任务管理器中显示的内容。

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

更新:

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

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

在这里,加密和安全性很重要,但是目前Windows正在笔记本电脑上的Linux内的VM中运行,并且这些应用仅通过仅主机虚拟网络上的专用NIC相互通信,这样数据包就不会溢出到真实网络中。

在会话0的Windows命令提示符下,我尝试运行远程控制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在会话3中以用户'SYSTEM'的身份运行。

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

是否有Windows命令来执行此操作? nodejs命令/模块/功能?

更多信息:

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

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

背景:这主要是为了运行我编写的远程桌面应用,非常类似于Screen-Connect或LogMeIn。它的工作原理非常好-除了它在您调用UAC或进入登录屏幕的任何时间都会暂停的部分之外,这对于远程IT工作而言尚不实用。

nodejs Windows服务应用程序本身也可以很好地发挥作用,它可以在启动时作为服务自动启动,无需登录或持续连接即可自动连接/重新连接到测试服务器,并且可以持续运行。

我基本上是在考虑是否可以在登录屏幕中运行它的实例,然后它应该能够捕获桌面视频捕获以输出到网络,并从网络调用远程鼠标和键盘输入。

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

不幸的是,在服务应用程序中植入robotjs无效-我尝试了一下,因为我至少想在controller-app中拥有一个自定义的远程登录屏幕,并让robotjs在远程应用程序中输入密码pc的登录屏幕-但没有运气。看来我只得到旧版Desktop 0,而不是基于robotjs的键盘/鼠标输入的登录屏幕。

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

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

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

2 个答案:

答案 0 :(得分:1)

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


要求:

下载paexec.exe。

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


推荐

从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'或其他意味着先停止然后在用户登录会话上运行。

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

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

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

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

如果您尝试从node.js服务运行此程序,则将需要使用process_child内置模块和 spawn cmd提示符从其运行。有很多示例,因此在此不做介绍。从Windows Service运行它的好处是它不会打开可见的窗口,您可以通过标准的child_process.spawn()方法和事件来提供I / O。


安全性:

通过Windows服务运行该程序(即通过node-windows和child_process.spawn),不仅可以在登录屏幕上运行 GUI应用,还可以在登录前的引导时(无论是否具有GUI)运行GUI应用-没有任何典型的不安全黑客,例如自动登录到特殊用户帐户然后锁定屏幕或注销等。它实际上是使用一种工具来镜像MicroSoft / SysInternals自己的工具,以便按照MS的官方规定方法进行操作

这里的弱点只是您的应用程序,因此请将其锁定并确保安全!


注意:观察到这是一个复杂的问题,这可能就是为什么似乎没有任何好的答案的原因-可能只有少数知道了答案的人才愿意分享。所以你去。

享受!


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


关于任务名称:

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


还有一件事:

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

如果它对我有用,我会很乐意拒绝我的回答,并接受您的回答!

答案 1 :(得分:1)

非常感谢您分享您的发现!这是另一件可以帮助他人的作品:

如果您不想创建单独的应用程序来仅启动服务,则可以使用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(因此,如果服务正在运行,paexec正在运行,因此您的应用程序正在运行),其标志与{{ 1}}很棒的答案。

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

相关问题