Beispiel #1
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
                }
            }
        }
Beispiel #5
0
        //////////////////////////////////////////////////////////////////////////////////////////////////////////
        //                                             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
                    }
                }
            }
        }