C# 我是否缺少Windows服务的明显替代方案?
我正在开发一个小软件,它是为一些特殊的基于Windows的信息亭设备设计的。它使用驱动程序监听某些击键/命令,截获它们并执行某些操作 目前,我的概念证明非常有效。我可以在后台将其作为控制台应用程序运行,也可以将其构建为Windows服务。Windows服务真的很有效,而且运行得很好,但一位同事暗示说,能够根据用户应用程序/窗口的活动状态执行任务是很好的——这是我无法(合法地)从Windows服务执行的,因为它无法枚举用户应用程序 显而易见的解决方案是只在后台运行它——除了这些信息亭使用自定义的Windows shell(使用组策略部署)之外,没有什么戏剧性的事情。因此,正常的explorer运行键不会初始化。我现在不知道如何在这种情况下使我的软件自动运行C# 我是否缺少Windows服务的明显替代方案?,c#,windows,C#,Windows,我正在开发一个小软件,它是为一些特殊的基于Windows的信息亭设备设计的。它使用驱动程序监听某些击键/命令,截获它们并执行某些操作 目前,我的概念证明非常有效。我可以在后台将其作为控制台应用程序运行,也可以将其构建为Windows服务。Windows服务真的很有效,而且运行得很好,但一位同事暗示说,能够根据用户应用程序/窗口的活动状态执行任务是很好的——这是我无法(合法地)从Windows服务执行的,因为它无法枚举用户应用程序 显而易见的解决方案是只在后台运行它——除了这些信息亭使用自定义的W
或者,如果有人有一个用于枚举活动窗口的变通方法,比如针对windows服务中的特定用户,我会对此感兴趣。注意:我实际上不需要对桌面做任何事情,只需读取数据。通过将我的应用程序添加到UserInit注册表项,我得到了想要的最终结果: HKLM\Software\Microsoft\Windows NT\Current Version\Winlogon\ Userinit c:\windows\system32\Userinit.exe,c:\myapp\myapp.exe
这很好用,但看起来确实有点骇人听闻,我喜欢其他选择。Windows Vista及以上版本根本不允许服务与桌面应用程序交互,这是操作系统安全性新重点的一部分。我为一个应用程序系统开发了一些类似的东西(在精神上),它列举了寻找特定遗留应用程序的windows,然后向它发送一些消息(所有这些都是非常光明正大的,没有其他方法可以自动处理破旧的应用程序)。我只是在人们登录时使用组策略将其作为系统托盘应用程序启动。但是我没有你正在处理的自定义Windows外壳的问题。祝你好运 因此,userinit(
HKLM\Software\Microsoft\windowsnt\Current Version\Winlogon\
)可能不是一个特别糟糕的地方,但应该有一两个替代方法。这实际上有点傻(如果你问我的话),这么多年来Windows中出现了多少自动运行位置
以下内容主要是从中复制的,并进行了一两次更新。我想它在这里可能也很方便,谁知道什么东西会永远活在网络上(或不会)
其他自动运行位置按顺序包括:
启动设备驱动程序
硬件相关
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services
Windows执行一些内部清理,然后启动Winlogon,启动服务控制管理器,启动服务和驱动程序
服务
SCM将启动启动启动值为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
**现在已处理其余的Autostart位置…
RunOnce(HKLM)主要用于安装程序,如果路径前面有感叹号(!),则在第一次运行后由操作系统删除,否则在程序运行前删除。这些程序以未定义的顺序同步启动,因此必须在加载HKLM/../Run、HKCU/../Run、HKCU/../RunOnce和启动文件夹之前全部完成。在安全模式下引导时忽略这些键
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx
运行自动运行标准程序的最常见启动位置,在安全模式下忽略,除非前缀为星号(*)
启动文件夹(所有用户)
Win7及以上版本%ProgramData%\Microsoft\Windows\Start菜单
Win XP/2KC:\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_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\u dll此注册表值包含加载user32.dll时将加载的dll列表。许多程序加载user32.dll,所以这里列出的任何内容都会加载到所有这些程序中。被恶意软件使用
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows
ShellServiceObjectDelayLoad类似于运行键,但指向已注册的CLSID InProcServer值。此键下列出的文件在计算机启动时,即启动过程的早期,由资源管理器自动加载
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad
SharedTaskScheduler此处列出的文件在启动Windows时自动运行
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SharedTaskScheduler
其他可能的autostart位置,具体取决于操作系统:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SharedTaskScheduler