using System; using System.Collections.Generic; using System.Linq; using Microsoft.Win32; using static Server.Helper.RegistrySeeker; namespace Server.Helper { public static class RegistryKeyHelper { private static string DEFAULT_VALUE = String.Empty; /// /// Adds a value to the registry key. /// /// Represents the possible values for a top-level node on a foreign machine. /// The path to the registry key. /// The name of the value. /// The value. /// If set to True, adds quotes to the value. /// True on success, else False. public static bool AddRegistryKeyValue(RegistryHive hive, string path, string name, string value, bool addQuotes = false) { try { using (RegistryKey key = RegistryKey.OpenBaseKey(hive, RegistryView.Registry64).OpenWritableSubKeySafe(path)) { if (key == null) return false; if (addQuotes && !value.StartsWith("\"") && !value.EndsWith("\"")) value = "\"" + value + "\""; key.SetValue(name, value); return true; } } catch (Exception) { return false; } } /// /// Opens a read-only registry key. /// /// Represents the possible values for a top-level node on a foreign machine. /// The path to the registry key. /// public static RegistryKey OpenReadonlySubKey(RegistryHive hive, string path) { try { return RegistryKey.OpenBaseKey(hive, RegistryView.Registry64).OpenSubKey(path, false); } catch { return null; } } /// /// Deletes the specified value from the registry key. /// /// Represents the possible values for a top-level node on a foreign machine. /// The path to the registry key. /// The name of the value to delete. /// True on success, else False. public static bool DeleteRegistryKeyValue(RegistryHive hive, string path, string name) { try { using (RegistryKey key = RegistryKey.OpenBaseKey(hive, RegistryView.Registry64).OpenWritableSubKeySafe(path)) { if (key == null) return false; key.DeleteValue(name, true); return true; } } catch (Exception) { return false; } } /// /// Checks if the provided value is the default value /// /// The name of the value /// True if default value, else False public static bool IsDefaultValue(string valueName) { return String.IsNullOrEmpty(valueName); } /// /// Adds the default value to the list of values and returns them as an array. /// If default value already exists this function will only return the list as an array. /// /// The list with the values for which the default value should be added to /// Array with all of the values including the default value public static RegValueData[] AddDefaultValue(List values) { if(!values.Any(value => IsDefaultValue(value.Name))) { values.Add(GetDefaultValue()); } return values.ToArray(); } /// /// Gets the default registry values /// /// A array with the default registry values public static RegValueData[] GetDefaultValues() { return new[] {GetDefaultValue()}; } public static RegValueData CreateRegValueData(string name, RegistryValueKind kind, object value = null) { var newRegValue = new RegValueData {Name = name, Kind = kind}; if (value == null) newRegValue.Data = new byte[] { }; else { switch (newRegValue.Kind) { case RegistryValueKind.Binary: newRegValue.Data = (byte[]) value; break; case RegistryValueKind.MultiString: newRegValue.Data = ByteConverter.GetBytes((string[]) value); break; case RegistryValueKind.DWord: newRegValue.Data = ByteConverter.GetBytes((uint) (int) value); break; case RegistryValueKind.QWord: newRegValue.Data = ByteConverter.GetBytes((ulong) (long) value); break; case RegistryValueKind.String: case RegistryValueKind.ExpandString: newRegValue.Data = ByteConverter.GetBytes((string) value); break; } } return newRegValue; } private static RegValueData GetDefaultValue() { return CreateRegValueData(DEFAULT_VALUE, RegistryValueKind.String); } } }