Windows 10:如何在不解锁本地机器的情况下让任务在启动时在用户空间中运行?

Windows 10:如何在不解锁本地机器的情况下让任务在启动时在用户空间中运行?

我有一台机器将部署在客户的位置。该机器将没有头,只能通过 RDC 访问。(除非发生灾难。)有一段软件必须始终运行,以记录来自连接传感器的数据。该软件仅在“前台”运行时才有效。也就是说,如果我使用“无论用户是否登录都运行”将其作为任务启动,我可以在任务管理器中看到,但没有记录任何数据。如果我将其关闭并通过任务计划程序运行任务,它仍然不会记录数据。如果我将其关闭并通过其固定的任务栏图标启动它,它就可以正常工作。

如何让此软件在启动时运行**?我希望当我使用用户名和密码登录 RDC 时,能够看到该应用程序。但是,如果有人插入键盘和鼠标,计算机将无法解锁。

** 我已将机器的 BIOS 设置为断电后自动启动。

答案1

使用 psexec 从计划任务运行。任务计划程序中有一个“系统启动时”选项。将其配置为运行:

psexec -u USERNAME -p PASSWORD -i 0 -d c:\path\to\program.exe

-i 0 告诉它在会话 0 中运行,从 2008 年开始是控制台会话。

答案2

我最终用出色的方法解决了这个问题(尽管文档有点混乱)nssm-非吸吮服务经理

我不是 Windows 管理员,所以我倾向于让一切都对 Unix 友好。希望这能有所帮助,而不是造成混淆。以下是我解决这个问题的方法(并为我未来的自己记录下来)。

  1. 安装choco因为它离你最近的地方apt或者brew对于 Windows。
  2. 安装cygwin因为我们将要使用 BASH。

    choco install --yes cygwin
    
  3. 安装nssm

    choco install --yes nssm
    
  4. 将以下内容保存到我将调用的脚本中create_service.sh

    name='Phone Home'
    command='C:\Program Files\Python35\python.exe'
    arguments='phone_home.py -p 3389'
    start_in='C:\Users\ET\Dropbox\src\' # Edit this shared code have it sync'd via Dropbox FTW!
    domain='.'
    username='ET'
    password='Use SSH and reverse port forwarding!'
    description='Launch Phone Home script at startup for real, not at log on. (Because this machine is headless, and how are you supposed to log in before it phones home?)'
    display_name="00 $name" # make it sort to the top in Services
    
    nssm stop    "$name"
    nssm remove  "$name" confirm
    nssm install "$name" "$command"   $arguments
    nssm set     "$name" AppDirectory "$start_in"
    nssm set     "$name" DisplayName  "$display_name"
    nssm set     "$name" ObjectName   "$domain\\$username" "$password"
    nssm set     "$name" Description  "$description"
    nssm start   "$name"
    
  5. nssm只需调用脚本即可通过 API“安装”Windows 服务。

    source create_service.sh
    

笔记:

nssm stop和命令nssm remove第一次将会失败,但我把它们放在那里,以便您可以重新运行脚本来更改您的服务。

这一切都暗示着存在一个非常复杂的远程代码执行和 Microsoft 远程桌面 ssh 代理系统。这又是另一个教训了。

相关内容