The below code will demonstrate how to list all the startup programs (also listed in msconfig) using C#.Net.
A custom class (cStartupPrograms) is added to store a startup program and it's relevant properties.
public class cStartupPrograms
{
public int StartupProgramId { get; set; }
public int ComputerId { get; set; }
public int StartupClassificationId { get; set; }
public string StartupClassificationName { get; set; }
public string ProgramName { get; set; }
public string ProgramPath { get; set; }
public bool? IsEnabled { get; set; }
public bool? IsDeleted { get; set; }
public string StartupType { get; set; }
public string Publisher { get; set; }
public string startupUserName { get; set; }
}
Below are the locations from where the startup programs are retrieved:
public static List<string> startupProgramsRegistryNames_Enabled = new List<string>()
{
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", //HKLM, HKCU
@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run", //HKLM
@"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
};
public static List<string> startupProgramsRegistryNames_Disabled = new List<string>()
{
@"SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder", //HKLM
@"SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg" //HKLM
};
public static List<string> startupProgramsRegistryNames_Enabled_OtherUsers = new List<string>()
{
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", //HKEY_USERS
@"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
};
public static string startupProgramPath = @"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup";
Below function will retrieve the list of startup program of all users:
private void getAllStartupPrograms()
{
List<cStartupPrograms> cStartupProgramList = null;
RegistryInfo rInfo1 = new RegistryInfo();
rInfo1.registryKey = Registry.CurrentUser;
RegistryInfo rInfo2 = new RegistryInfo();
rInfo2.registryKey = Registry.LocalMachine;
List<RegistryInfo> rInfoList = new List<RegistryInfo>();
rInfoList.Add(rInfo1);
rInfoList.Add(rInfo2);
try
{
cStartupProgramList = new List<cStartupPrograms>();
//Enabled programs
//All users
string[] files = Directory.GetFiles(startupProgramPath, "*");
foreach (string fileName in files)
{
if (File.Exists(fileName))
{
string target = GetShortcutTargetFile(fileName);
if (!String.IsNullOrEmpty(target))
{
cStartupPrograms startupProgram = new cStartupPrograms();
startupProgram.ComputerId = Convert.ToInt32(frmPreferences.ComputerId);
startupProgram.IsDeleted = false;
startupProgram.IsEnabled = true;
startupProgram.ProgramName = System.IO.Path.GetFileName(fileName);
startupProgram.ProgramPath = target;
startupProgram.StartupClassificationName = cEnum.eStartupClassification.Windows.ToString();
startupProgram.startupUserName = "All Users";
startupProgram.StartupType =startupProgramPath;
//if (!cStartupProgramList.Exists(p => p.ProgramName == fileName && p.ProgramPath == target))
cStartupProgramList.Add(startupProgram);
}
}
}
//All users
foreach (RegistryInfo rInfo in rInfoList)
{
RegistryKey regKey = rInfo.registryKey;
foreach (string registryName in startupProgramsRegistryNames_Enabled)
{
string runOrRunOnceString = null;
int n = registryName.LastIndexOf("\\");
runOrRunOnceString = registryName.Substring(n + 1);
using (RegistryKey startupKey = regKey.OpenSubKey(registryName))
{
if (startupKey == null)
continue;
var valueNames = startupKey.GetValueNames();
foreach (var name in valueNames)
{
cStartupPrograms startupProgram = new .cStartupPrograms();
startupProgram.ComputerId = Convert.ToInt32(frmPreferences.ComputerId);
startupProgram.IsDeleted = false;
startupProgram.IsEnabled = true;
startupProgram.ProgramName = name;
startupProgram.ProgramPath = Convert.ToString(startupKey.GetValue(name));
startupProgram.StartupClassificationName = cEnum.eStartupClassification.Windows.ToString();
startupProgram.startupUserName = "All Users";
startupProgram.StartupType = startupKey.ToString();
//if (!cStartupProgramList.Exists(p => p.ProgramName == name && p.ProgramPath == startupProgram.ProgramPath))
cStartupProgramList.Add(startupProgram);
}
}
}
}
//Other users
string[] hkeyUserNames = Registry.Users.GetSubKeyNames();
foreach (string key in hkeyUserNames)
{
string userName = GetOwnerName(key);
if (string.IsNullOrEmpty(userName))
continue;
RegistryKey startupKey = Registry.Users.OpenSubKey(key);
if (startupKey == null)
continue;
foreach (string registryName in startupProgramsRegistryNames_Enabled_OtherUsers)
{
string runOrRunOnceString = null;
int n = registryName.LastIndexOf("\\");
runOrRunOnceString = registryName.Substring(n + 1);
using (RegistryKey userKey = startupKey.OpenSubKey(registryName))
{
if (userKey == null)
continue;
var valueNames = userKey.GetValueNames();
foreach (var name in valueNames)
{
cStartupPrograms startupProgram = new cStartupPrograms();
startupProgram.ComputerId = Convert.ToInt32(frmPreferences.ComputerId);
startupProgram.IsDeleted = false;
startupProgram.IsEnabled = true;
startupProgram.ProgramName = name;
startupProgram.ProgramPath = Convert.ToString(userKey.GetValue(name));
startupProgram.StartupClassificationName = cEnum.eStartupClassification.Windows.ToString();
startupProgram.startupUserName = userName;
startupProgram.StartupType = userKey.ToString();
//if (!cStartupProgramList.Exists(p => p.ProgramName == name && p.ProgramPath == startupProgram.ProgramPath && p.startupUserName==userName))
cStartupProgramList.Add(startupProgram);
}
}
}
}
//Disabled programs
foreach (string registryName in startupProgramsRegistryNames_Disabled)
{
using (RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) //
{
using (RegistryKey startupkey = hklm.OpenSubKey(registryName))
{
if (startupkey == null)
continue;
foreach (string key in startupkey.GetSubKeyNames())
{
using (RegistryKey rk = startupkey.OpenSubKey(key))
{
cStartupPrograms startupProgram = new cStartupPrograms();
startupProgram.ComputerId = Convert.ToInt32(frmPreferences.ComputerId);
startupProgram.IsDeleted = false;
startupProgram.IsEnabled = false;
startupProgram.ProgramName = Convert.ToString(rk.GetValue("item"));
startupProgram.ProgramPath = Convert.ToString(rk.GetValue("command"));
startupProgram.StartupClassificationName = cEnum.eStartupClassification.Windows.ToString();
var hkeyVal = rk.GetValue("hkey");
if (hkeyVal != null)
{
string keyVal = Convert.ToString(rk.GetValue("key"));
string runOrRunOnceString = null;
int n = keyVal.LastIndexOf("\\");
runOrRunOnceString = keyVal.Substring(n + 1);
if (hkeyVal.ToString() == "HKLM")
{
startupProgram.StartupType = Registry.LocalMachine.ToString() + "\\" + keyVal;
}
else if (hkeyVal.ToString() == "HKCU")
{
startupProgram.StartupType = Registry.CurrentUser.ToString() + "\\" + keyVal;
}
}
else
{
startupProgram.StartupType = Convert.ToString(rk.GetValue("location"));
}
startupProgram.startupUserName = "All Users";
//if (!cStartupProgramList.Exists(p => p.ProgramName == startupProgram.ProgramName && p.ProgramPath == startupProgram.ProgramPath))
cStartupProgramList.Add(startupProgram);
}
}
}
}
}
}
catch (Exception ex)
{
return;
}
}