public static List <DmServiceDefinition> LoadInstalledServicesOldSystem() { var daemons = new List <DmServiceDefinition>(); ServiceController[] sc = ServiceController.GetServices(); foreach (ServiceController service in sc) { if (!service.ServiceName.Contains("DaemonMaster_")) { continue; } using (RegistryKey key = Registry.LocalMachine.OpenSubKey(RegPath + service.ServiceName, false)) { if (key == null) { throw new Exception("Can't open registry key!"); } var serviceDefinition = new DmServiceDefinition(Convert.ToString(service.ServiceName)) { DisplayName = service.DisplayName, //Convert.ToString(key.GetValue("DisplayName")), Credentials = new ServiceCredentials(Convert.ToString(key.GetValue("ObjectName", ServiceCredentials.LocalSystem)), null), }; using (RegistryKey parameters = key.OpenSubKey("Parameters", false)) { serviceDefinition.BinaryPath = Convert.ToString(parameters.GetValue("BinaryPath")); } daemons.Add(serviceDefinition); } } return(daemons); }
public static List <DmServiceDefinition> GetInstalledServices() { var services = new List <DmServiceDefinition>(); using RegistryKey mainKey = Registry.LocalMachine.OpenSubKey(ServiceRegPath, RegistryKeyPermissionCheck.ReadSubTree); if (mainKey == null) { return(services); } foreach (string serviceName in mainKey.GetSubKeyNames()) { using (RegistryKey key = mainKey.OpenSubKey(serviceName, RegistryKeyPermissionCheck.ReadSubTree)) { //If the key invalid, skip this service if (key == null) { continue; } //Get the exe path of the service to determine later if its a service from DaemonMaster string serviceExePath = Convert.ToString(key.GetValue("ImagePath")); //Check service path if (string.IsNullOrWhiteSpace(serviceExePath) || !DaemonMasterUtils.ComparePaths(serviceExePath, ServiceControlManager.DmServiceExe)) { continue; } var serviceDefinition = new DmServiceDefinition(serviceName) { DisplayName = Convert.ToString(key.GetValue("DisplayName")), Credentials = new ServiceCredentials(Convert.ToString(key.GetValue("ObjectName", ServiceCredentials.LocalSystem)), null), }; using (RegistryKey parameters = key.OpenSubKey("Parameters", RegistryKeyPermissionCheck.ReadSubTree)) { //If the key invalid, skip it (this key is not important for the service) if (parameters != null) { serviceDefinition.BinaryPath = Convert.ToString(parameters.GetValue("BinaryPath")); } } services.Add(serviceDefinition); } } return(services); }
public static List <DmServiceDefinition> LoadInstalledServicesNewSystem() { var daemons = new List <DmServiceDefinition>(); using (RegistryKey mainKey = Registry.LocalMachine.OpenSubKey(RegPath, RegistryKeyPermissionCheck.ReadSubTree)) { foreach (string serviceName in mainKey.GetSubKeyNames()) { using (RegistryKey key = mainKey.OpenSubKey(serviceName, RegistryKeyPermissionCheck.ReadSubTree)) { //If the key invalid, skip this service if (key == null) { continue; } //Get the exe path of the service to determine later if its a service from DaemonMaster string serviceExePath = Convert.ToString(key.GetValue("ImagePath") ?? string.Empty); //If the serviceExePath is invalid skip this service if (string.IsNullOrWhiteSpace(serviceExePath)) { continue; } if (!serviceExePath.Contains(ServiceControlManager.DmServiceExe)) { continue; } var serviceDefinition = new DmServiceDefinition(serviceName) { DisplayName = Convert.ToString(key.GetValue("DisplayName")), Credentials = new ServiceCredentials(Convert.ToString(key.GetValue("ObjectName", ServiceCredentials.LocalSystem)), null), }; using (RegistryKey parameters = key.OpenSubKey("Parameters", RegistryKeyPermissionCheck.ReadSubTree)) { serviceDefinition.BinaryPath = Convert.ToString(parameters.GetValue("BinaryPath")); } daemons.Add(serviceDefinition); } } } return(daemons); }
public static DmServiceDefinition LoadServiceStartInfosFromRegistry(string serviceName) { //Open Regkey folder using (RegistryKey key = Registry.LocalMachine.OpenSubKey(RegPath + serviceName, RegistryKeyPermissionCheck.ReadSubTree)) { var serviceDefinition = new DmServiceDefinition(Convert.ToString(serviceName)) { DisplayName = Convert.ToString(key.GetValue("DisplayName")), Description = Convert.ToString(key.GetValue("Description", string.Empty)), DependOnService = (string[])key.GetValue("DependOnService", Array.Empty <string>()), DependOnGroup = (string[])key.GetValue("DependOnGroup", Array.Empty <string>()), LoadOrderGroup = Convert.ToString(key.GetValue("Group", string.Empty)), DelayedStart = Convert.ToBoolean(key.GetValue("DelayedAutostart", false)), StartType = (Advapi32.ServiceStartType)Convert.ToUInt32(key.GetValue("Start", 2)) }; string username = Convert.ToString(key.GetValue("ObjectName", "")); if (string.IsNullOrWhiteSpace(username)) { serviceDefinition.Credentials = ServiceCredentials.LocalSystem; } else { serviceDefinition.Credentials = new ServiceCredentials(username, null); } //Open Parameters SubKey using (RegistryKey parameters = key.OpenSubKey("Parameters", RegistryKeyPermissionCheck.ReadSubTree)) { serviceDefinition.BinaryPath = Convert.ToString(parameters.GetValue("BinaryPath")); serviceDefinition.Arguments = Convert.ToString(parameters.GetValue("Arguments", string.Empty)); serviceDefinition.ProcessMaxRestarts = Convert.ToInt32(parameters.GetValue("ProcessMaxRestarts", 3)); serviceDefinition.ProcessTimeoutTime = Convert.ToInt32(parameters.GetValue("ProcessTimeoutTime", 9500)); serviceDefinition.ProcessRestartDelay = Convert.ToInt32(parameters.GetValue("ProcessRestartDelay", 2000)); serviceDefinition.CounterResetTime = Convert.ToInt32(parameters.GetValue("CounterResetTime", 43200)); serviceDefinition.ProcessPriority = (ProcessPriorityClass)parameters.GetValue("ProcessPriority", ProcessPriorityClass.Normal); serviceDefinition.IsConsoleApplication = Convert.ToBoolean(parameters.GetValue("IsConsoleApplication", false)); serviceDefinition.UseCtrlC = Convert.ToBoolean(parameters.GetValue("UseCtrlC", false)); serviceDefinition.CanInteractWithDesktop = Convert.ToBoolean(parameters.GetValue("CanInteractWithDesktop", false)); serviceDefinition.UseEventLog = Convert.ToBoolean(parameters.GetValue("UseEventLog", false)); return(serviceDefinition); } } }
////////////////////////////////////////////////////////////////////////////////////////////////////////// // METHODS // ////////////////////////////////////////////////////////////////////////////////////////////////////////// public static void SaveInRegistry(DmServiceDefinition serviceDefinition) { using (RegistryKey key = Registry.LocalMachine.CreateSubKey(RegPath + serviceDefinition.ServiceName, RegistryKeyPermissionCheck.ReadWriteSubTree)) { //Open Parameters SubKey using (RegistryKey parameters = key.CreateSubKey("Parameters", RegistryKeyPermissionCheck.ReadWriteSubTree)) { //Strings parameters.SetValue("BinaryPath", serviceDefinition.BinaryPath, RegistryValueKind.String); parameters.SetValue("Arguments", serviceDefinition.Arguments, RegistryValueKind.String); //Ints parameters.SetValue("ProcessMaxRestarts", serviceDefinition.ProcessMaxRestarts, RegistryValueKind.DWord); parameters.SetValue("ProcessTimeoutTime", serviceDefinition.ProcessTimeoutTime, RegistryValueKind.DWord); parameters.SetValue("ProcessRestartDelay", serviceDefinition.ProcessRestartDelay, RegistryValueKind.DWord); parameters.SetValue("CounterResetTime", serviceDefinition.CounterResetTime, RegistryValueKind.DWord); parameters.SetValue("ProcessPriority", serviceDefinition.ProcessPriority, RegistryValueKind.DWord); //Bools parameters.SetValue("IsConsoleApplication", serviceDefinition.IsConsoleApplication, RegistryValueKind.DWord); parameters.SetValue("UseCtrlC", serviceDefinition.UseCtrlC, RegistryValueKind.DWord); parameters.SetValue("CanInteractWithDesktop", serviceDefinition.CanInteractWithDesktop, RegistryValueKind.DWord); parameters.SetValue("UseEventLog", serviceDefinition.UseEventLog, RegistryValueKind.DWord); } //Create an give the user the permission to write to this key (needed for save the PID of the process if it's not the LocalSystem account) using (RegistryKey processInfo = key.CreateSubKey("ProcessInfo", RegistryKeyPermissionCheck.ReadWriteSubTree)) { #region Setting permissions //Only needed when user account has changed if (!Equals(serviceDefinition.Credentials, ServiceCredentials.NoChange)) { //Create a new RegistrySecurity object var rs = new RegistrySecurity(); // Author: Nick Sarabyn - https://stackoverflow.com/questions/3282656/setting-inheritance-and-propagation-flags-with-set-acl-and-powershell // ╔═════════════╦═════════════╦═════════════════════════════════╦══════════════════════════╦══════════════════╦═════════════════════════╦═══════════════╦═════════════╗ // ║ ║ folder only ║ folder, sub - folders and files ║ folder and sub - folders ║ folder and files ║ sub - folders and files ║ sub - folders ║ files ║ // ╠═════════════╬═════════════╬═════════════════════════════════╬══════════════════════════╬══════════════════╬═════════════════════════╬═══════════════╬═════════════╣ // ║ Propagation ║ none ║ none ║ none ║ none ║ InheritOnly ║ InheritOnly ║ InheritOnly ║ // ║ Inheritance ║ none ║ Container|Object ║ Container ║ Object ║ Container|Object ║ Container ║ Object ║ // ╚═════════════╩═════════════╩═════════════════════════════════╩══════════════════════════╩══════════════════╩═════════════════════════╩═══════════════╩═════════════╝ ////Add access rule for user (only when it is not LocalSystem) if (Equals(serviceDefinition.Credentials, ServiceCredentials.LocalSystem)) { rs.AddAccessRule(new RegistryAccessRule((NTAccount) new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null).Translate(typeof(NTAccount)), RegistryRights.WriteKey, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); } else if (Equals(serviceDefinition.Credentials, ServiceCredentials.LocalService)) { rs.AddAccessRule(new RegistryAccessRule((NTAccount) new SecurityIdentifier(WellKnownSidType.LocalServiceSid, null).Translate(typeof(NTAccount)), RegistryRights.WriteKey, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); } else if (Equals(serviceDefinition.Credentials, ServiceCredentials.NetworkService)) { rs.AddAccessRule(new RegistryAccessRule((NTAccount) new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null).Translate(typeof(NTAccount)), RegistryRights.WriteKey, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); } else { rs.AddAccessRule(new RegistryAccessRule(new NTAccount(serviceDefinition.Credentials.Username), RegistryRights.WriteKey, InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); } processInfo.SetAccessControl(rs); #endregion } } } }