Static implementation to convert a local username to the corresponding SID-Value where the registry keys are stored under HKEY_USERS
        private bool ResetRegistryEntries(PersistentRegistryFile persistentRegistryFile)
        {
            var success        = true;
            var sid            = persistentRegistryFile.FileContent.SID;
            var username       = persistentRegistryFile.FileContent.Username;
            var originalValues = new Dictionary <RegistryIdentifiers, object>(persistentRegistryFile.FileContent.RegistryValues);

            try
            {
                Logger.Log("SID: " + (sid ?? "<NULL>"));
                Logger.Log("Username: "******"<NULL>"));

                if (String.IsNullOrEmpty(sid) && String.IsNullOrEmpty(username))
                {
                    Logger.Log("Cannot reset registry entries without SID or username information!");

                    return(false);
                }

                if (String.IsNullOrEmpty(sid))
                {
                    sid = SIDHandler.GetSIDFromUsername(username);

                    if (String.IsNullOrWhiteSpace(sid))
                    {
                        Logger.Log($"Failed to reset registry entries because SID could not be determined for user '{username}''!");

                        return(false);
                    }

                    Logger.Log($"SID from username: {sid}");
                }

                foreach (var originalValue in originalValues)
                {
                    var entry = TryCreateEntry(originalValue.Key, sid);

                    if (!CanReset(entry))
                    {
                        success = false;

                        continue;
                    }

                    try
                    {
                        Reset(entry, originalValue.Value);

                        persistentRegistryFile.FileContent.RegistryValues.Remove(originalValue.Key);
                        persistentRegistryFile.Save();
                    }
                    catch (Exception ex)
                    {
                        Logger.Log(ex, String.Format("Unable to reset the registry value for '{0}': {1}: {2}", entry, ex.Message, ex.StackTrace));
                        success = false;
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Log(ex, string.Format("Unable to reset registry value: {0}: {1}", ex.Message, ex.StackTrace));
                success = false;
            }

            Logger.Log("Initiating group policy update...");
            new CommandExecutor.CommandExecutor().ExecuteCommandAsync("gpupdate /force");

            return(success);
        }
        /// <summary>
        /// Sets the registry values
        /// </summary>
        /// <param name="newValues">The registry values to set</param>
        /// <param name="sid">The sid of the currently logged in user - needed to identify the correct registry key path</param>
        /// <param name="username">The username of the currently logged in user - needed to identify the correct registry key path</param>
        /// <returns>true if all operations succeeded, false if something went wrong. See the logfile for details then.</returns>
        public bool SetRegistryEntries(Dictionary <RegistryIdentifiers, object> newValues, string sid, string username)
        {
            bool res = true;

            try
            {
                Logger.Log("SID: " + (sid ?? "<NULL>"));
                Logger.Log("Username: "******"<NULL>"));

                if (String.IsNullOrEmpty(sid) && String.IsNullOrEmpty(username))
                {
                    Logger.Log("Cannot set registry entries without SID or username information!");

                    return(false);
                }

                if (string.IsNullOrEmpty(sid))
                {
                    sid = SIDHandler.GetSIDFromUsername(username);

                    if (String.IsNullOrWhiteSpace(sid))
                    {
                        Logger.Log($"Failed to set registry entries because SID could not be determined for user '{username}''!");

                        return(false);
                    }
                    else
                    {
                        Logger.Log("SID from username: "******"<NULL>"));
                    }
                }

                using (var persistentRegistryFile = new PersistentRegistryFile(username, sid))
                {
                    Logger.Log("Attempting to set new registry values...");

                    foreach (var newValue in newValues)
                    {
                        var regEntry = TryCreateEntry(newValue.Key, sid);

                        //If the class could not be instantiated it means either reflection did not work properly or the registry-class does not exists
                        //don't interrupt the whole process but set the return value to false to indicate a possible error
                        if (regEntry is null)
                        {
                            res = false;

                            continue;
                        }

                        //If the registry value could not have been set correctly or something went wrong with the persistent registry file
                        //don't interrupt the whole process but set the return value to false to indicate a possible error
                        //but never change a registry key without successfully write the persistent registry file
                        try
                        {
                            //If there is nothing to change, then do not change anything
                            if (object.Equals(newValue.Value, regEntry.GetValue()))
                            {
                                Logger.Log(String.Format("Registry key '{0}' already has value '{1}', skipping it.", regEntry, newValue.Value ?? "<NULL>"));

                                continue;
                            }

                            //Only store the entry in the persistent file if not already existing
                            if (!persistentRegistryFile.FileContent.RegistryValues.ContainsKey(newValue.Key))
                            {
                                persistentRegistryFile.FileContent.RegistryValues.Add(newValue.Key, regEntry.GetValue());
                                //Save after every change
                                persistentRegistryFile.Save();
                            }

                            //Change the registry value if all operations succeeded until here
                            if (newValue.Value is null)
                            {
                                var deleted = regEntry.TryDelete();

                                if (!deleted && regEntry.GetValue() != null)
                                {
                                    Logger.Log($"Failed to delete registry key '{regEntry}'!");
                                    res = false;

                                    continue;
                                }

                                Logger.Log($"Deleted registry key '{regEntry}'.");
                            }
                            else
                            {
                                regEntry.SetValue(newValue.Value);
                                Logger.Log($"Set registry key '{regEntry}' to '{newValue.Value}'.");
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Log(ex, String.Format("Unable to set the registry value for '{0}': {1}: {2}", regEntry, ex.Message, ex.StackTrace));
                            res = false;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Log(ex, string.Format("Unable to set Registry value: {0}: {1}", ex.Message, ex.StackTrace));
                res = false;
            }

            return(res);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Sets the registry values
        /// </summary>
        /// <param name="registryValues">The registry values to set</param>
        /// <param name="sid">The sid of the currently logged in user - needed to identify the correct registry key path</param>
        /// <param name="username">The username of the currently logged in user - needed to identify the correct registry key path</param>
        /// <returns>true if all operations succeeded, false if something went wrong. See the logfile for details then.</returns>
        public bool SetRegistryEntries(Dictionary <RegistryIdentifiers, object> registryValues, string sid, string username)
        {
            bool res = true;

            try
            {
                using (var persistentRegistryFile = new PersistentRegistryFile(username, sid))
                {
                    Logger.Log("SID: " + sid);
                    Logger.Log("Username: "******"SID from Username: "******"SebWindowsServiceWCF.RegistryHandler.Reg{0}", registryValue.Key));
                            if (type == null)
                            {
                                continue;
                            }
                            regEntry = (RegistryEntry)Activator.CreateInstance(type, sid);
                        }
                        catch (Exception ex)
                        {
                            Logger.Log(ex, String.Format("Unable to instantiate registryclass: {0}", registryValue.Key));
                            res = false;
                            continue;
                        }

                        //If the registry value could not have been set correctly or something went wrong with the persistent registry file
                        //don't interrupt the whole process but set the return value to false to indicate a possible error
                        //but never change a registry key without successfully writing the persistent registry file
                        try
                        {
                            //If there is nothing to change, then do not change anything
                            if (object.Equals(registryValue.Value, regEntry.DataValue))
                            {
                                continue;
                            }

                            //Only store the entry in the persistent file if not already existing
                            if (!persistentRegistryFile.FileContent.RegistryValues.ContainsKey(registryValue.Key))
                            {
                                persistentRegistryFile.FileContent.RegistryValues.Add(registryValue.Key, regEntry.DataValue);
                                //Save after every change
                                persistentRegistryFile.Save();
                            }
                            //Change the registry value if all operations succeeded until here
                            regEntry.DataValue = registryValue.Value;
                            Logger.Log(String.Format("Set Registry Key {0} to {1}", registryValue.Key, registryValue.Value));
                            if (!object.Equals(regEntry.DataValue, registryValue.Value))
                            {
                                Logger.Log(String.Format("Registry Key {0} could not been set to {1}",
                                                         registryValue.Key, registryValue.Value));
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Log(ex, String.Format("Unable to set the registry value for {0}", registryValue.Key));
                            res = false;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Log(ex, "Unable to set Registry value");
                res = false;
            }

            return(res);
        }