protected override void ProcessRecord() { if (Inherit != Item.NONE || !string.IsNullOrEmpty(Access)) { using (RegistryKey regKey = RegistryControl.GetRegistryKey(Path, true, true)) { RegistrySecurity security = regKey.GetAccessControl(); // 上位からのアクセス権継承の設定変更 switch (Inherit) { case Item.ENABLE: TestGenerator.RegistryInherit(Path, true); security.SetAccessRuleProtection(false, false); break; case Item.DISABLE: TestGenerator.RegistryInherit(Path, false); security.SetAccessRuleProtection(true, true); break; case Item.REMOVE: TestGenerator.RegistryInherit(Path, false); security.SetAccessRuleProtection(true, false); break; } // Access文字列からのアクセス権設定 if (!string.IsNullOrEmpty(Access)) { foreach (string ruleString in Access.Contains("/") ? Access.Split('/') : new string[1] { Access }) { // テスト自動生成 TestGenerator.RegistryAccess(Path, ruleString, true); security.SetAccessRule(RegistryControl.StringToAccessRule(ruleString)); } } /* * foreach (RegistryAccessRule accessRule in RegistryControl.StringToAccess(Access)) * { * security.SetAccessRule(accessRule); * } */ regKey.SetAccessControl(security); } } // 所有者変更 if (Owner != null) { // テスト自動生成 TestGenerator.RegistryOwner(Path, Owner); // 埋め込みのsubinacl.exeを展開 string tempDir = System.IO.Path.Combine( Environment.ExpandEnvironmentVariables("%TEMP%"), "PowerReg"); string subinacl = System.IO.Path.Combine(tempDir, "subinacl.exe"); if (!File.Exists(subinacl)) { EmbeddedResource.Expand(tempDir); } // 管理者実行確認 Message.CheckAdmin(); using (Process proc = new Process()) { proc.StartInfo.FileName = subinacl; proc.StartInfo.Arguments = $"/subkeyreg \"{Path}\" /owner=\"{Owner}\""; proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; proc.Start(); proc.WaitForExit(); } } // レジストリ値の設定 if (Name != null) { // テスト自動生成 TestGenerator.RegistryName(Path, Name); TestGenerator.RegistryType(Path, Name, Type); TestGenerator.RegistryValue(Path, Name, Value); switch (Type) { case Item.REG_SZ: Registry.SetValue(Path, Name, Value, RegistryValueKind.String); break; case Item.REG_BINARY: Registry.SetValue(Path, Name, RegistryControl.RegBinaryStringToBytes(Value), RegistryValueKind.Binary); break; case Item.REG_DWORD: Registry.SetValue(Path, Name, int.Parse(Value), RegistryValueKind.DWord); break; case Item.REG_QWORD: Registry.SetValue(Path, Name, long.Parse(Value), RegistryValueKind.QWord); break; case Item.REG_MULTI_SZ: Registry.SetValue(Path, Name, Regex.Split(Value, "\\\\0"), RegistryValueKind.MultiString); break; case Item.REG_EXPAND_SZ: Registry.SetValue(Path, Name, Value, RegistryValueKind.ExpandString); break; case Item.REG_NONE: Registry.SetValue(Path, Name, new byte[2] { 0, 0 }, RegistryValueKind.None); break; } } }