我是不是错过了一个明显的Windows服务替代品?

本文关键字:Windows 服务 替代品 一个 错过了 是不是 | 更新日期: 2023-09-27 18:16:22

我正在为一些特殊的基于Windows的kiosk设备设计一个小软件。它使用驱动程序侦听某些按键/命令,拦截它们并执行某些操作。

目前,我的概念证明工作得很好。我既可以在后台将其作为控制台应用程序运行,也可以将其构建为Windows服务。Windows服务真的很有效,而且工作得很好,但是一位同事暗示说,如果能够根据用户应用程序/窗口的活动来执行任务就更好了——这是我不能从Windows服务中(合法地)做到的,因为它不能枚举用户应用程序。

显而易见的解决方案是在后台运行它——没有什么问题,除了这些kiosk使用自定义Windows shell(使用组策略部署)。因此,正常的资源管理器Run键不会初始化。我现在在如何使我的软件自动运行在这种情况下的损失?

或者,如果有人有一个从windows服务中为特定用户枚举活动窗口的解决方案,我会对此感兴趣。注:我不需要对桌面做任何实际操作,只需要读取数据。

我是不是错过了一个明显的Windows服务替代品?

Windows Vista及以上版本根本不允许服务与桌面应用程序交互,这是操作系统对安全的新关注的一部分。我为一个应用程序系统开发了一些类似的东西(在精神上),它列举了寻找特定遗留应用程序的窗口,然后向它发送一些消息(所有这些都非常光明正大,没有其他方法可以自动运行陈旧的应用程序)。我只是在人们登录时使用组策略将其作为系统托盘应用程序启动。但我没有你正在处理的自定义Windows shell的问题。好运!

因此,userinit (HKLM'Software'Microsoft'Windows NT'Current Version'Winlogon')可能不是一个特别糟糕的地方,但应该有一两个替代方案。这实际上有点傻(如果你问我的话)这么多年来在Windows中出现了多少Autorun位置。

以下内容主要来自http://www.bleepingcomputer.com/tutorials/windows-program-automatic-startup-locations/,并进行了一两次更新。我觉得在这里可能也很方便,谁知道什么会永远存在于网络上(或不存在)?

其他自动运行位置包括以下顺序:

启动设备驱动程序

硬件相关。

  HKEY_LOCAL_MACHINE'System'CurrentControlSet'Services

Windows做一些内部清理,然后启动Winlogon,它启动服务控制管理器,它启动服务和驱动程序。

SCM启动标记为Start值为2的服务和驱动程序。

  HKEY_LOCAL_MACHINE'System'CurrentControlSet'Services

RunServicesOnce

  HKEY_LOCAL_MACHINE'Software'Microsoft'Windows'CurrentVersion'RunServicesOnce
  HKEY_CURRENT_USER'Software'Microsoft'Windows'CurrentVersion'RunServicesOnce

RunServices

HKLM/……/RunOnce条目将不会运行,直到它们完成启动。

  HKEY_LOCAL_MACHINE'Software'Microsoft'Windows'CurrentVersion'RunServices
  HKEY_CURRENT_USER'Software'Microsoft'Windows'CurrentVersion'RunServices

**显示登录提示符,用户登录,然后继续自动启动处理。

Notify响应事件运行程序,包括登录、注销、启动、关机、启动屏保、停止屏保。恶意软件经常使用这个密钥来启动自己。

  HKEY_LOCAL_MACHINE'SOFTWARE'Microsoft'Windows NT'CurrentVersion'Winlogon'Notify

UserInit指定应在用户登录后立即启动的程序,接受逗号分隔的程序列表。默认的userinit.exe程序加载您的配置文件。也是恶意软件常用的密钥。

  HKEY_LOCAL_MACHINE'Software'Microsoft'Windows NT'CurrentVersion'Winlogon'Userinit

Shell包含userinit.exe将启动的程序的逗号分隔列表。默认shell为explorer.exe。首先是香港大学的课程,然后是香港管理学院的课程。

  HKEY_CURRENT_USER'Software'Microsoft'Windows NT'CurrentVersion'Winlogon'Shell
  HKEY_LOCAL_MACHINE'Software'Microsoft'Windows NT'CurrentVersion'Winlogon'Shell

**其余的自动启动位置现在被处理…

RunOnce (HKLM)主要用于安装程序,如果路径前面有感叹号(!),则在第一次运行后由操作系统删除,否则在程序运行前删除。这些程序以未定义的顺序同步启动,因此它们必须在HKLM/…/运行,HKCU/…/运行,HKCU/…可以加载/RunOnce和Startup文件夹。在安全模式下启动时,这些键将被忽略。

  HKEY_LOCAL_MACHINE'Software'Microsoft'Windows'CurrentVersion'RunOnce
  HKEY_LOCAL_MACHINE'Software'Microsoft'Windows'CurrentVersion'RunOnceEx

Run标准程序自动运行的最常见启动位置,在安全模式下忽略,除非前缀带有星号(*)。

  HKEY_LOCAL_MACHINE'Software'Microsoft'Windows'CurrentVersion'Run
  HKEY_CURRENT_USER'Software'Microsoft'Windows'CurrentVersion'Run

启动文件夹(所有用户)

Win7及以上%ProgramData%'Microsoft'Windows'Start Menu

Win XP/2K C:'Documents and Settings'All Users'Start Menu'Programs'Startup

启动文件夹(每用户)

Win7及以上%USERPROFILE%'AppData'Roaming'Microsoft'Windows'Start Menu'Programs'Startup

Win XP/2K %USERPROFILE%'Start Menu'Programs'Startup

RunOnce (HKCU)主要用于设置程序,与上面的HKLM RunOnce键的语义相同。

  HKEY_CURRENT_USER'Software'Microsoft'Windows'CurrentVersion'RunOnce

资源管理器运行通常用于根据策略配置运行程序。

  HKEY_LOCAL_MACHINE'Software'Microsoft'Windows'CurrentVersion'Policies'Explorer'Run
  HKEY_CURRENT_USER'Software'Microsoft'Windows'CurrentVersion'Policies'Explorer'Run

加载键已弃用,不再常用。

  HKEY_CURRENT_USER'Software'Microsoft'Windows NT'CurrentVersion'Windows'load

appinit_dll 此注册表值包含加载user32.dll时将加载的dll列表。许多程序都加载user32.dll,因此这里列出的任何东西也会加载到所有这些程序中。被恶意软件使用。

  HKEY_LOCAL_MACHINE'Software'Microsoft'Windows NT'CurrentVersion'Windows

ShellServiceObjectDelayLoad类似于Run键,但指向已注册的CLSID InProcServer值。当计算机启动时,在启动过程的早期,资源管理器会自动加载此键下列出的文件。

  HKEY_LOCAL_MACHINE'SOFTWARE'Microsoft'Windows'CurrentVersion'ShellServiceObjectDelayLoad

SharedTaskScheduler这里列出的文件在启动Windows时会自动运行。

  HKEY_LOCAL_MACHINE'SOFTWARE'Microsoft'Windows'CurrentVersion'Explorer'SharedTaskScheduler

其他可能的自动启动位置,取决于操作系统:

  1. c: ' autoexec.bat
  2. c: ' config.sys3.%WINDIR%'wininit.ini -通常由安装程序使用,使文件运行一次,然后被删除。
  3. %列出% ' winstart.bat
  4. %WINDIR%'win.ini - [windows] "load"
  5. %WINDIR%'win.ini - [windows] "run"
  6. %WINDIR%'system.ini - [boot] "shell"
  7. %WINDIR%'system.ini - [boot] " scrsave .exe"
  8. %WINDIR%'dosstart.bat -在Win95或98中,当你在关机菜单中选择"在MS-DOS模式下重启"时使用。
  9. %列出% ' system ' autoexec.nt
  10. %列出% ' system ' config.nt

通过将我的应用程序添加到UserInit注册表项,我已经得到了我想要的最终结果:

HKLM'Software'Microsoft'Windows NT'Current Version'Winlogon'

Userinit c: ' windows ' system32系统' userinit.exe, c: ' myapp ' myapp.exe

这工作得很好,但似乎令人难以置信的黑客,我喜欢替代品。

使用Windows服务是最好的选择,因为服务在会话0中是隔离的,你可以让这个服务在用户登录时启动另一个exe,通过调用[CreateProcessAsUser][1]。实际上,服务可执行文件可以用一个参数来调用自己,该参数表明它是作为用户调用的,因此所有用户界面部分(通常不会从会话0开始工作)将被启用。