原文连接
这里介绍了2种方法
操作不需要管理员权限
这个原链接讲的很清楚。我只补充1点。就是using IWshRuntimeLibrary;
这个引用是要自己去增加引用的。而搜索方法是在COM
项中,搜索Windows Script Host Object Model
。这个原文在代码也里写了,只是不太明显,没注意可能就忽略了。
操作需要管理员权限
这就有很多点可以说了,全是折磨
一共有3个位置。
计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
其实我们要操作的只有2个
即
计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
比较坑的就是,如果我们操作x64系统还是x64编译程序时(触发条件有点记不清了),系统会自动将我们对HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\……
的操作,转移到HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\……
中。这个转移过程是全自动的,添加、移出都会转移。
补充:在HKEY_CURRENT_USER
注册仅影响当前用户,在HKEY_LOCAL_MACHINE
注册可以影响该系统下所有用户。
首先,这个默认管理员是代码设置的管理员权限,而不是安装后通过右键属性获取的管理员权限。
即通过
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
来实现应用的必须获取管理员权限才能启动。
而这也遇到了很多问题,这些问题是我最终导致我选择使用第一种方法来实现开机自启动。
注册表位置 | 是否获得 管理员权限 |
应用安装位置 | 现象 |
---|---|---|---|
Local_Machine | 是 | 系统盘 | 可以自启动 |
Local_Machine | 是 | 非系统盘 | 可以自启动 |
Local_Machine | 否 | 系统盘 | 可以自启动 |
Local_Machine | 否 | 非系统盘 | 可以自启动 |
Current_User | 是 | 系统盘 | 不可以自启动 |
Current_User | 是 | 非系统盘 | 不可以自启动 |
Current_User | 否 | 系统盘 | 不可以自启动 |
Current_User | 否 | 非系统盘 | 可以自启动 |
可以看到操作Current_User注册表时,有时功能会无效,我也进入注册表内去排查,发现注册表内的记录已注册成功,且与功能正常时完全一样。但自启动功能就是不好使,非常令人费解。还有另一个重要问题是:当我代码使用的是操作Local_Machine注册表的方法时,我打包应用与安装应用的时候总会有病毒提示。
大体就是这个2个问题,希望能找到问题原因和解决办法。
也就是我上面描述的:应用安装后,在通过右键属性设置管理员权限的情况。大致可以有以下几种简单情况:
排查过程中发现有几个有意思的点。
第一,右键设置的管理员权限无法影响代码控制的管理员权限。如上一条在代码中设置了requireAdministrator
。启动应用时会要求获取管理员权限。但右键该应用查看属性会发现,上述需要勾选管理员权限的位置都没有勾选。其实这点非常好理解,代码设置是应用的自我要求,即我不关心谁启动我,但都必须满足我要求的管理员权限我才能启动。系统的右键设置是系统的手段,即我不关心应用有什么要求,我都会以管理员权限来启动应用。
第二,给应用程序设置管理员权限和给快捷方式设置管理员权限是有区别的,给快捷方式设置仅会影响该快捷方式启动应用的权限,给应用程序设置则会影响所有启动该应用的路径。当然这很明显,但有时候也会忽略。测试时图省事就只给快捷方式设置了管理员权限,忘记了一些注册在注册表中的快捷功能也需要应用程序的管理员权限。导致怀疑了好久人生,引以为戒。
第三。是一个猜测,即右键设置管理员权限大概也是在系统注册表中进行注册,且应用卸载时,该注册表记录也不会清空。这导致如下现象的发生,假设一个情景:安装应用后,将应用程序设为管理员权限,再将应用程序卸载。此时,如果再次将该应用程序安装在相同位置,则该应用自动会继承原来设置的管理员权限。即安装后,不用设置,右键打开属性就可以发现,此应用已勾选了管理员权限。有2点注意。第一,安装应用必须在完全相同的位置。第二,如上,右键管理员有2个勾选管理员权限的位置,第一次设置的哪个,后续继承的就是哪个。
其实这些都是很简单的知识点,但有时候真会把人的思路带跑偏。以我自己为例。我本来选择的是通过代码控制注册表Current_User
来实现开机自启动。如上所说,这种方法的自启动功能有时会失效(为什么失效我现在也没整明白)。失效时我尝试配合设置右键的管理员权限来测试是否可以使功能恢复,结果右键设置了管理员权限,自启动功能也不好使。所以我就只能换一种方法来实现开机自启动功能。当我修改完代码重新打包安装后,明明我没有设置管理员权限的要求,安装后却需要管理员权限。顿时就给我整蒙了,我还以为是新代码造成了这种现象,排查了好久代码。总之就都是这种又蠢又令人迷惑的问题。