private static void CleanKeyParents(RegistryKey baseKey, string keyPath) { using (RegistryKey registryKey1 = baseKey.OpenSubKey(keyPath, true)) { if (registryKey1 != null && (registryKey1.ValueCount != 0 || registryKey1.SubKeyCount != 0)) { return; } string[] strArray = keyPath.Split('\\'); if (strArray.Length <= 2) { return; } string subkey = strArray[strArray.Length - 1]; string str = keyPath.Remove(keyPath.Length - subkey.Length - 1); if (registryKey1 != null) { using (RegistryKey registryKey2 = baseKey.OpenSubKey(str, true)) registryKey2.DeleteSubKey(subkey, true); } SecuritySupport.CleanKeyParents(baseKey, str); } }
internal static void SetExecutionPolicy( ExecutionPolicyScope scope, ExecutionPolicy policy, string shellId) { string str = "Restricted"; string configurationPath = Utils.GetRegistryConfigurationPath(shellId); switch (policy) { case ExecutionPolicy.Unrestricted: str = "Unrestricted"; break; case ExecutionPolicy.RemoteSigned: str = "RemoteSigned"; break; case ExecutionPolicy.AllSigned: str = "AllSigned"; break; case ExecutionPolicy.Restricted: str = "Restricted"; break; case ExecutionPolicy.Bypass: str = "Bypass"; break; } switch (scope) { case ExecutionPolicyScope.Process: if (policy == ExecutionPolicy.Undefined) { str = (string)null; } Environment.SetEnvironmentVariable("PSExecutionPolicyPreference", str); break; case ExecutionPolicyScope.CurrentUser: if (policy == ExecutionPolicy.Undefined) { using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(configurationPath, true)) { if (registryKey != null) { if (registryKey.GetValue("ExecutionPolicy") != null) { registryKey.DeleteValue("ExecutionPolicy"); } } } SecuritySupport.CleanKeyParents(Registry.CurrentUser, configurationPath); break; } using (RegistryKey subKey = Registry.CurrentUser.CreateSubKey(configurationPath)) { subKey.SetValue("ExecutionPolicy", (object)str, RegistryValueKind.String); break; } case ExecutionPolicyScope.LocalMachine: if (policy == ExecutionPolicy.Undefined) { using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(configurationPath, true)) { if (registryKey != null) { if (registryKey.GetValue("ExecutionPolicy") != null) { registryKey.DeleteValue("ExecutionPolicy"); } } } SecuritySupport.CleanKeyParents(Registry.LocalMachine, configurationPath); break; } using (RegistryKey subKey = Registry.LocalMachine.CreateSubKey(configurationPath)) { subKey.SetValue("ExecutionPolicy", (object)str, RegistryValueKind.String); break; } } }