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



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

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

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

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

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

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

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

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

启动设备驱动程序

硬件相关。

  HKEY_LOCAL_MACHINESystemCurrentControlSetServices

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

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

  HKEY_LOCAL_MACHINESystemCurrentControlSetServices

RunServicesOnce

  HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServicesOnce
  HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunServicesOnce

RunServices

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

  HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServices
  HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunServices

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

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

  HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogonNotify

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

  HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogonUserinit

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

  HKEY_CURRENT_USERSoftwareMicrosoftWindows NTCurrentVersionWinlogonShell
  HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogonShell

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

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

  HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnce
  HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnceEx

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

  HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun
  HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun

启动文件夹(所有用户)

Win7及以上%ProgramData%MicrosoftWindowsStart Menu

Win XP/2K C:Documents and SettingsAll UsersStart MenuProgramsStartup

启动文件夹(每用户)

Win7及以上%USERPROFILE%AppDataRoamingMicrosoftWindowsStart MenuProgramsStartup

Win XP/2K %USERPROFILE%Start MenuProgramsStartup

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

  HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnce

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

  HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerRun
  HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerRun

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

  HKEY_CURRENT_USERSoftwareMicrosoftWindows NTCurrentVersionWindowsload

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

  HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWindows

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

  HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionShellServiceObjectDelayLoad

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

  HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerSharedTaskScheduler

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

  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注册表项,我已经得到了我想要的最终结果:

HKLMSoftwareMicrosoftWindows NTCurrent VersionWinlogon

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

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

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

最新更新