.NET如何获取Windows 10/11的全部开机启动项?
在.NET中获取全部Windows开机启动项
你之前只读取了Run路径的注册表项,这只是Windows开机启动项的一部分,要获取全部19个,需要覆盖以下几个核心来源:
一、需要检查的启动项来源
- 注册表的
Run/RunOnce键(含64位系统的32位兼容分支) - 当前用户和公共用户的Startup文件夹
- 任务计划程序中设置为开机/登录触发的任务
1. 读取注册表中的启动项
Windows 64位系统会为32位程序单独保留Wow6432Node分支,所以要同时检查常规路径和这个分支,还要覆盖CurrentUser和LocalMachine两个根键。
using Microsoft.Win32; using System.Collections.Generic; public static Dictionary<string, string> GetRegistryStartupEntries() { var startupEntries = new Dictionary<string, string>(); // 定义所有需要检查的注册表路径 var registryPaths = new[] { @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", @"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce", @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run", @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce" }; // 遍历两个根注册表键 foreach (var rootKey in new[] { Registry.CurrentUser, Registry.LocalMachine }) { foreach (var path in registryPaths) { using (var subKey = rootKey.OpenSubKey(path)) { if (subKey == null) continue; // 读取当前键下的所有启动项 foreach (var valueName in subKey.GetValueNames()) { var value = subKey.GetValue(valueName)?.ToString(); if (!string.IsNullOrEmpty(value) && !startupEntries.ContainsKey(valueName)) { startupEntries.Add(valueName, value); } } } } } return startupEntries; }
2. 读取Startup文件夹中的快捷方式
Windows有两个Startup文件夹:一个是当前用户专属,另一个是所有用户共享的,放在这里的快捷方式会随系统开机启动。
using System.IO; using System.Collections.Generic; public static List<string> GetStartupFolderEntries() { var startupShortcuts = new List<string>(); // 获取当前用户和公共用户的Startup文件夹路径 string currentUserStartup = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup)); string commonUserStartup = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonStartup)); // 遍历两个文件夹下的所有快捷方式 foreach (var folderPath in new[] { currentUserStartup, commonUserStartup }) { if (!Directory.Exists(folderPath)) continue; foreach (var shortcut in Directory.GetFiles(folderPath, "*.lnk")) { startupShortcuts.Add(shortcut); } } return startupShortcuts; }
3. 读取任务计划中的开机触发任务
很多软件会通过Windows任务计划设置开机/登录触发的任务,这部分也是开机启动项的重要组成。需要先安装Microsoft.Win32.TaskScheduler NuGet包。
using Microsoft.Win32.TaskScheduler; using System.Collections.Generic; public static List<string> GetStartupTaskEntries() { var startupTasks = new List<string>(); using (var taskService = new TaskService()) { // 遍历所有任务,筛选出开机或登录触发的任务 foreach (var task in taskService.AllTasks) { bool isStartupTrigger = task.Triggers.Any(t => t is LogonTrigger || t is BootTrigger); if (isStartupTrigger) { startupTasks.Add($"{task.Path}\\{task.Name}"); } } } return startupTasks; }
4. 整合所有来源获取全部启动项
把上面三个方法的结果整合起来,就能得到完整的开机启动项列表:
public static void CollectAllStartupEntries() { // 获取注册表启动项 var registryEntries = GetRegistryStartupEntries(); Console.WriteLine("=== 注册表启动项 ==="); foreach (var entry in registryEntries) { Console.WriteLine($"- {entry.Key}: {entry.Value}"); } // 获取Startup文件夹快捷方式 var folderEntries = GetStartupFolderEntries(); Console.WriteLine("\n=== Startup文件夹快捷方式 ==="); foreach (var entry in folderEntries) { Console.WriteLine($"- {entry}"); } // 获取任务计划开机任务 var taskEntries = GetStartupTaskEntries(); Console.WriteLine("\n=== 任务计划开机触发任务 ==="); foreach (var entry in taskEntries) { Console.WriteLine($"- {entry}"); } }
注意事项
- 访问
Registry.LocalMachine分支和系统级任务计划需要管理员权限,否则会读取不到部分项 - 少数软件会通过服务依赖、浏览器扩展等方式启动,这些不属于常规开机启动项范畴,若需要可进一步扩展逻辑
内容的提问来源于stack exchange,提问作者Jahongir Ozodov
相关产品推荐
相关产品推荐

