我是不是错过了一个明显的Windows服务替代品?
本文关键字:Windows 服务 替代品 一个 错过了 是不是 | 更新日期: 2023-09-27 18:16:22
我正在为一些特殊的基于Windows的kiosk设备设计一个小软件。它使用驱动程序侦听某些按键/命令,拦截它们并执行某些操作。
目前,我的概念证明工作得很好。我既可以在后台将其作为控制台应用程序运行,也可以将其构建为Windows服务。Windows服务真的很有效,而且工作得很好,但是一位同事暗示说,如果能够根据用户应用程序/窗口的活动来执行任务就更好了——这是我不能从Windows服务中(合法地)做到的,因为它不能枚举用户应用程序。
显而易见的解决方案是在后台运行它——没有什么问题,除了这些kiosk使用自定义Windows shell(使用组策略部署)。因此,正常的资源管理器Run键不会初始化。我现在在如何使我的软件自动运行在这种情况下的损失?
或者,如果有人有一个从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
其他可能的自动启动位置,取决于操作系统:
- c: ' autoexec.bat
- c: ' config.sys3.%WINDIR%'wininit.ini -通常由安装程序使用,使文件运行一次,然后被删除。
- %列出% ' winstart.bat
- %WINDIR%'win.ini - [windows] "load"
- %WINDIR%'win.ini - [windows] "run"
- %WINDIR%'system.ini - [boot] "shell"
- %WINDIR%'system.ini - [boot] " scrsave .exe"
- %WINDIR%'dosstart.bat -在Win95或98中,当你在关机菜单中选择"在MS-DOS模式下重启"时使用。
- %列出% ' system ' autoexec.nt
- %列出% ' 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开始工作)将被启用。