本文主要讲解系统中哪些常用位置可以让你的应用程序开机自启以及解释它们之间的关系。
一、有哪些常用位置可以做到让应用开机启动呢?
-
当前用户专有的启动文件夹
%AppData%MicrosoftWindowsStart MenuPrograms
-
所有用户有效的启动文件夹
%ProgramData%MicrosoftWindowsStart MenuPrograms
-
Userinit注册键
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionWinlogonUserinit
通常该注册表下面有一个userinit.exe,但这个键值是允许用逗号来分隔多个程序的,比如 userinit.exe,Crius.exe(举例)
-
ExplorerRun注册键
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerRun
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerRun
-
RunServicesOnce注册键
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunServicesOnce
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunServicesOnce
RunServicesOnce注册键是用来启动服务的,启动时间是在用户登录之前,而且是先于其它通过注册键启动的程序。
-
RunServices注册键
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunServices
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunServices
RunServices注册键指定的程序紧接RunServicesOnce指定的程序之后运行,启动时间也是在用户登录之前。
-
RunOnce注册键
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnce
HKEY_LOCAL_MACHINESoftwareWOW6432NodeMicrosoftWindowsCurrentVersionRunOnce
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnce
HKEY_LOCAL_MACHINE下面的RunOnce注册键会在用户登录之后立即运行程序,运行的时机是在其它Run键指定的程序之前。
HKEY_CURRENT_USER
则会启动比较慢,它会在操作系统处理其他Run键以及“启动”文件夹的内容之后运行。 -
Run注册键
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun
HKEY_LOCAL_MACHINESoftwareWOW6432NodeMicrosoftWindowsCurrentVersionRun
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun
Run是自动运行程序最常用的注册表。
会先执行HKEY_LOCAL_MACHINE下的Run注册键内容
再执行HKEY_CURRENT_USER下的Run注册键内容
但两者都是在处理“启动文件夹”之前
二、它们的执行顺序呢?
很明显,RunServicesOnce与RunService肯定是最快的,因为他们在用户还未登录之前就已经开始异步调用其内容了。
而其它位置都是从用户登录后才开始执行。所以我们忽略掉上面两个Services的自启键,只讲启动文件夹、userinit、ExplorerRun、RunOnce、Run。
-
经过验证,它们的启动顺序如下:
缩写:
HKLM:HKEY_LOCAL_MACHINE
HKCU:HKEY_CURRENT_USER
Userinit注册键 > HKLM_RunOnce注册键 > HKLM_ExplorerRun注册键 > HKLM_Run注册键 > HKCU_ExplorerRun注册键 > HKCU_Run注册键
> 所有用户有效的启动文件夹 > 当前用户专有的启动文件夹 > HKCU_RunOnce注册键
三、需要注意什么呢?
- 启动的应用是否需要管理员权限,如果需要管理员权限,并不是每个自启的注册表位置都能启动,请查阅下表:
WinlogonUserinit HKLM_RunOnce
HKLM_Run
HKLM_ExplorerRun
WOW6432Node_HKLM_RunOnce
WOW6432Node_HKLM_Run
HKCU_ExplorerRun
HKCU_Run
HKCU_RunOnce
所有用户有效的启动文件夹
当前用户专有的启动文件夹
管理员应用 N Y N N Y Y N N Y N N 非管理员应用 Y Y Y Y Y Y Y Y Y Y Y -
HKLM_RunOnce是一个比较特殊的注册表,由它起的应用都是管理员权限的,持有特权
-
HKLM_RunOnce注册键中的内容是由runonce.exe调起来的,它的级别是管理员级别的;
-
当你把开机启动项写到HKLM_RunOnce注册键中时,启动的进程都是管理员权限的;
-
在HKLM_RunOnce注册键中,多个项不可以同时运行起来,必须等待一个进程结束后,另外一个进程方可运行起来;
-
在所有进程结束前,不能登录到桌面(如果你是后台程序除外);
-
- 当你启动的应用需要管理员权限时,HKCU下的自启注册键、HKLM_Run以及HKLM_ExplorerRun都不能自启
- HKCU_RunOnce比较特殊,如果你的账户拥有管理员权限,就能启动需要管理员权限的应用,并且起起来的应用都是持有特权的
- Remember:RunOnce在执行完毕之后注册表的键值就会被删掉了。
四、如何将应用执行路径写到Userinit中呢?
请使用一下脚本,在执行脚本的时候,需要传入参数,也就是你exe的执行路径:
ExecWait '"$INSTDIRSupportFilesAddCriusAutoRunPath.bat" "$INSTDIR${PRODUCT_NAME}_${PRODUCT_VERSION}${PATH_PRODUCT_EXE}"'