我正在开发一款专为基于Windows的特殊信息亭设备设计的小软件。它使用驱动程序侦听某些击键/命令,拦截它们并执行某些操作。
在那一刻,我的概念证明工作得很好。我可以在后台运行它作为控制台应用程序,或者我也将它构建为Windows服务。 Windows服务非常有效并且运行良好,但是一位同事暗示能够根据用户应用程序/窗口处于活动状态来执行任务是件好事 - 我无法(合法地)从Windows执行此操作service,因为它无法枚举用户应用程序。
显而易见的解决方案是在后台运行它 - 没有戏剧性,除了这些自助服务终端使用自定义Windows shell(使用组策略部署)。因此,正常的资源管理器运行键不会初始化。我现在对如何在这种情况下自动运行我的软件感到茫然?
或者,如果有人为Windows服务中的特定用户提供了枚举活动窗口的解决方法,我会对此感兴趣。注意:我不需要在桌面上做任何事情,只需读取数据。
答案 0 :(得分:3)
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/复制而来,或更新一两个。我觉得它在这里也很方便,谁知道什么会永远留在网上(或不是)?
其他Autorun位置按顺序包括以下内容:
启动设备驱动程序
硬件相关。
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
**显示登录提示,用户登录,然后自动开始处理继续。
通知运行程序以响应事件,包括登录,注销,启动,关闭,startscreensaver,stopscreensaver。恶意软件经常使用此密钥启动。
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。首先启动HKCU的计划,然后是HKLM的计划。
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
**现在处理剩余的自动启动位置......
RunOnce(HKLM)主要用于安装程序,如果路径前面有感叹号(!),则在第一次运行后由操作系统删除,否则在程序运行之前删除。这些程序以未定义的顺序同步启动,因此它们必须在HKLM /.../ Run,HKCU /.../ Run,HKCU /.../ RunOnce和Startup文件夹之前完成。在安全模式下启动时会忽略这些键。
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx
运行标准程序自动运行的最常见启动位置,在安全模式下被忽略,除非以星号(*)作为前缀。
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_DLLs 此注册表值包含加载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 :(得分:0)
通过将我的应用程序添加到UserInit注册表项,我得到了我想要的最终结果:
HKLM \ Software \ Microsoft \ Windows NT \ Current Version \ Winlogon \
Userinit c:\ windows \ system32 \ userinit.exe,c:\ myapp \ myapp.exe
这很好用,但确实看起来非常黑客,我喜欢替代品。
答案 2 :(得分:0)
使用Windows服务是最好的选择,并且由于服务在会话0中被隔离,因此您可以通过调用[CreateProcessAsUser][1]
使该服务在用户登录时启动另一个exe。实际上,该服务可执行文件可以使用一个指示其以用户身份被调用的参数来调用自身,因此将启用所有用户界面部分(通常从会话0开始不起作用)。