|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Security.AccessControl;
|
|
using System.Security.Principal;
|
|
using Microsoft.Win32;
|
|
using Microsoft.Win32.Security;
|
|
|
|
namespace install_wim_tweak
|
|
{
|
|
class Program
|
|
{
|
|
const string HIVE_MOUNT_DIR = "windows6_x_software";
|
|
static string _pkgDirectory = HIVE_MOUNT_DIR + "\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\";
|
|
const string HIVE_MOUNT_POINT = "HKLM\\" + HIVE_MOUNT_DIR;
|
|
const string REGISTRY_PATH = "Windows\\system32\\config\\SOFTWARE";
|
|
|
|
static readonly string ProgramHeader =
|
|
"-------------------------------------------\n" +
|
|
"--------Registry Tweak Tool v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version + "-------\n" +
|
|
"---------------for Windows 6.x-------------\n" +
|
|
"---------Created by Michał Wnuowski--------\n" +
|
|
"-----Concept by Aviv00@msfn / lite8@MDL----\n" +
|
|
"-----------Modified by Legolash2o----------\n" +
|
|
"-------------------------------------------\n\n";
|
|
|
|
const String PROGRAM_HELP_INFO =
|
|
"USAGE : \n" +
|
|
" install_wim_tweak [/p <Path>] [/c <PackageName> (optional)] [/?]\n\n" +
|
|
"REMARKS : \n" +
|
|
" /p<Path> Use '/p' switch to provide path to mounted install.wim\n" +
|
|
" /o Use '/o' to run on current Windows\n" +
|
|
" /c <ComponentName> Use '/c' to show a specific package\n" +
|
|
" /? Use '/?' switch to display this info\n" +
|
|
" /l Outputs all packages to \"Packages.txt\"\n" +
|
|
"EXAMPLE : \n" +
|
|
" install_wim_tweak /p C:\\temp files\\mount\n" +
|
|
" install_wim_tweak /c Microsoft-Hyper-V-Common-Drivers-Package";
|
|
|
|
|
|
static bool _failed;
|
|
static string _bkpFile;
|
|
static string _hiveFileInfo;
|
|
static string _comp = "";
|
|
static Dictionary<char, string> _cmdLineArgs;
|
|
static bool _online;
|
|
static readonly string PackLog = Environment.CurrentDirectory + "\\Packages.txt";
|
|
static string _cr = "";
|
|
static bool _vis;
|
|
|
|
//static Sid SysUser = new Sid();
|
|
|
|
static void Main(string[] args)
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.White;
|
|
Console.Write(ProgramHeader);
|
|
Console.ResetColor();
|
|
|
|
try
|
|
{
|
|
_cmdLineArgs = ProcessCmdArgs(args, new char[] { 'p', '?', 'c', 'o', 'l', 'r', 'n', 'h', 'd' });
|
|
|
|
|
|
if (_cmdLineArgs.ContainsKey('?'))
|
|
{
|
|
|
|
Console.Write(PROGRAM_HELP_INFO);
|
|
Console.ForegroundColor = ConsoleColor.Cyan;
|
|
Console.Write("\nPlease make sure you use lowercase for the /p, /c, /o and /l");
|
|
Console.ResetColor();
|
|
Environment.Exit(1);
|
|
}
|
|
|
|
|
|
if (_cmdLineArgs.ContainsKey('c'))
|
|
{
|
|
if (!string.IsNullOrEmpty(_cmdLineArgs['c']))
|
|
{
|
|
_comp = Path.Combine(_cmdLineArgs['c'], "");
|
|
}
|
|
else
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.White;
|
|
Console.WriteLine("Type the name of the package, if nothing is entered all packages will be made visible :");
|
|
Console.ForegroundColor = ConsoleColor.Cyan;
|
|
_comp = Path.Combine(Console.ReadLine(), "");
|
|
}
|
|
Console.ResetColor();
|
|
}
|
|
|
|
if (_cmdLineArgs.ContainsKey('o'))
|
|
{
|
|
_hiveFileInfo = Path.Combine(System.IO.Path.GetPathRoot(Environment.SystemDirectory), REGISTRY_PATH);
|
|
Console.ForegroundColor = ConsoleColor.Cyan;
|
|
Console.WriteLine("MountPath : Online");
|
|
Console.ResetColor();
|
|
_pkgDirectory = _pkgDirectory.Replace("windows6_x_software", "Software");
|
|
_online = true;
|
|
}
|
|
|
|
if (_cmdLineArgs.ContainsKey('h'))
|
|
{
|
|
_vis = true;
|
|
}
|
|
|
|
if (!_cmdLineArgs.ContainsKey('o'))
|
|
{
|
|
if (!_cmdLineArgs.ContainsKey('p'))
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.White;
|
|
Console.WriteLine("Type path to mounted install.wim :");
|
|
Console.ForegroundColor = ConsoleColor.Cyan;
|
|
_hiveFileInfo = Path.Combine(Console.ReadLine(), REGISTRY_PATH);
|
|
|
|
if (_hiveFileInfo.Substring(0, _hiveFileInfo.Length - REGISTRY_PATH.Length).Length == 3)
|
|
{
|
|
Console.WriteLine("MountPath : Online");
|
|
_pkgDirectory = _pkgDirectory.Replace("windows6_x_software", "Software");
|
|
_online = true;
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("MountPath : {0}", "\"" + _hiveFileInfo.Substring(0, _hiveFileInfo.Length - REGISTRY_PATH.Length) + "\"");
|
|
_online = false;
|
|
}
|
|
Console.ResetColor();
|
|
}
|
|
else
|
|
{
|
|
_hiveFileInfo = Path.Combine(_cmdLineArgs['p'], REGISTRY_PATH);
|
|
Console.ForegroundColor = ConsoleColor.Cyan;
|
|
if (_cmdLineArgs['p'].Length == 3)
|
|
{
|
|
Console.WriteLine("MountPath : Online");
|
|
_pkgDirectory = _pkgDirectory.Replace("windows6_x_software", "Software");
|
|
_online = true;
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("MountPath : {0}", "\"" + _cmdLineArgs['p'] + "\"");
|
|
_online = false;
|
|
}
|
|
|
|
Console.ResetColor();
|
|
}
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(_hiveFileInfo))
|
|
Environment.Exit(-2);
|
|
|
|
if (!File.Exists(_hiveFileInfo))
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.WriteLine("Registry file not found, please make sure your mount path is correct!");
|
|
Console.ResetColor();
|
|
_failed = true;
|
|
Environment.Exit(-532459699);
|
|
}
|
|
|
|
if (!string.IsNullOrEmpty(_comp))
|
|
{
|
|
string T = _comp;
|
|
while (T.Contains("~"))
|
|
{
|
|
T = T.Substring(0, T.Length - 1);
|
|
}
|
|
Console.ForegroundColor = ConsoleColor.Cyan;
|
|
Console.WriteLine("Component : " + "\"" + T + "\"");
|
|
Console.ResetColor();
|
|
}
|
|
|
|
Console.ForegroundColor = ConsoleColor.White;
|
|
Console.WriteLine("\n------------------Starting-----------------");
|
|
Console.ResetColor();
|
|
if (_online == false)
|
|
{
|
|
if (!_cmdLineArgs.ContainsKey('l') && !_cmdLineArgs.ContainsKey('n'))
|
|
{
|
|
Console.Write("Creating BKP of registry file... ");
|
|
_bkpFile = Path.Combine(Environment.CurrentDirectory, "SOFTWAREBKP");
|
|
if (!File.Exists(_bkpFile))
|
|
{
|
|
File.Copy(_hiveFileInfo, _bkpFile, true);
|
|
}
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.ResetColor();
|
|
}
|
|
|
|
Console.Write("Mounting registry file... ");
|
|
if (!Contains<string[], string>(Registry.LocalMachine.GetSubKeyNames(), HIVE_MOUNT_DIR))
|
|
{
|
|
if (!LoadHive(_hiveFileInfo, HIVE_MOUNT_POINT))
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.WriteLine("FAIL");
|
|
Console.ResetColor();
|
|
_failed = true;
|
|
Ending();
|
|
}
|
|
}
|
|
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.ResetColor();
|
|
}
|
|
|
|
if (_cmdLineArgs.ContainsKey('l'))
|
|
{
|
|
Console.Write("Writing to Log (Packages.txt) ");
|
|
if (File.Exists(PackLog)) { File.Delete(PackLog); }
|
|
ListComponentSubkeys(_pkgDirectory + "Packages\\");
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.Write("OK");
|
|
Console.ResetColor();
|
|
Ending();
|
|
}
|
|
|
|
Console.Write("Taking Ownership... ");
|
|
|
|
var myProcToken = new AccessTokenProcess(Process.GetCurrentProcess().Id, TokenAccessType.TOKEN_ALL_ACCESS | TokenAccessType.TOKEN_ADJUST_PRIVILEGES);
|
|
myProcToken.EnablePrivilege(new TokenPrivilege(TokenPrivilege.SE_TAKE_OWNERSHIP_NAME, true));
|
|
|
|
|
|
if (Win32.GetLastError() != 0)
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.WriteLine("FAIL");
|
|
Console.WriteLine("You must be logged as Administrator.");
|
|
Console.ResetColor();
|
|
_failed = true;
|
|
Ending();
|
|
}
|
|
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.ResetColor();
|
|
|
|
|
|
Console.Write("Editing \'Packages\' subkeys ");
|
|
try
|
|
{
|
|
if (CleanComponentSubkeys(_pkgDirectory + "Packages\\", _comp))
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.ResetColor();
|
|
}
|
|
}
|
|
catch { }
|
|
if (_online == false)
|
|
{
|
|
Console.Write("Editing \'PackagesPending\' subkeys ");
|
|
try
|
|
{
|
|
if (CleanComponentSubkeys(_pkgDirectory + "PackagesPending\\", _comp))
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.ResetColor();
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
|
|
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("Modifying registry completed sucessfully.");
|
|
Console.ResetColor();
|
|
|
|
if (_cmdLineArgs.ContainsKey('r'))
|
|
{
|
|
|
|
if (Contains<string[], string>(Microsoft.Win32.Registry.LocalMachine.GetSubKeyNames(), HIVE_MOUNT_DIR))
|
|
{
|
|
Console.Write("Unmounting key... ");
|
|
if (!UnloadHive(HIVE_MOUNT_POINT))
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.WriteLine("FAIL");
|
|
Console.WriteLine("You must unmount registry hive manually.");
|
|
Console.WriteLine("Hit any key to close.");
|
|
Console.ResetColor();
|
|
Console.ReadKey();
|
|
Environment.Exit(-3);
|
|
}
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.ResetColor();
|
|
|
|
}
|
|
|
|
Console.Write("Removing \'Packages\'... ");
|
|
if (RemoveComponentSubkeys(_pkgDirectory + "Packages\\", _comp))
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.WriteLine("Removed packages successfully.");
|
|
Console.ResetColor();
|
|
}
|
|
|
|
Console.Write("Removing \'PackagesPending\'... ");
|
|
if (RemoveComponentSubkeys(_pkgDirectory + "Packages\\", _comp))
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.WriteLine("Removed packages successfully.");
|
|
Console.ResetColor();
|
|
}
|
|
|
|
}
|
|
|
|
Ending();
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.WriteLine("FAIL");
|
|
Console.WriteLine("Unhandled error occured.");
|
|
Console.ResetColor();
|
|
Console.WriteLine(ex.Message);
|
|
_failed = true;
|
|
Ending();
|
|
}
|
|
|
|
}
|
|
|
|
static bool RemoveComponentSubkeys(string registryPath, string Comp)
|
|
{
|
|
int consoleX = 0; int consoleY = 0;
|
|
try
|
|
{
|
|
consoleX = Console.CursorLeft; consoleY = Console.CursorTop;
|
|
}
|
|
catch { }
|
|
|
|
|
|
int count = 1;
|
|
int tot = 0;
|
|
string PackL = _hiveFileInfo;
|
|
while (!PackL.EndsWith("\\Windows\\"))
|
|
{
|
|
PackL = PackL.Substring(0, PackL.Length - 1);
|
|
}
|
|
PackL = PackL.Replace("Windows\\", "");
|
|
|
|
foreach (string subkeyname in _cr.Split(Environment.NewLine.ToCharArray()))
|
|
{
|
|
if (Comp != null && (subkeyname.StartsWith(Comp) && !string.IsNullOrEmpty(Comp)))
|
|
{
|
|
tot += 1;
|
|
}
|
|
}
|
|
foreach (string subkeyname in _cr.Split(Environment.NewLine.ToCharArray()))
|
|
{
|
|
if (subkeyname.StartsWith(Comp) && !string.IsNullOrEmpty(Comp))
|
|
{
|
|
CorrectConsolePostion(tot, consoleY, consoleX);
|
|
|
|
|
|
Console.ForegroundColor = ConsoleColor.Yellow;
|
|
Console.Write("{0}/{1}", count, tot);
|
|
Console.ResetColor();
|
|
try
|
|
{
|
|
Process RC = new Process();
|
|
RC.StartInfo.FileName = "pkgmgr.exe";
|
|
if (_online == false)
|
|
{
|
|
RC.StartInfo.Arguments = "/o:" + "\"" + PackL + ";" + PackL + "Windows" + "\"" + " /up:" + subkeyname + " /norestart /quiet";
|
|
}
|
|
else
|
|
{
|
|
RC.StartInfo.Arguments = "/up:" + subkeyname + " /norestart /quiet";
|
|
}
|
|
RC.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
|
|
RC.Start();
|
|
RC.WaitForExit();
|
|
}
|
|
catch (Exception Ex) { Console.WriteLine(Ex.Message); }
|
|
count++;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool ListComponentSubkeys(string registryPath)
|
|
{
|
|
int consoleX = 0; int consoleY = 0;
|
|
try
|
|
{
|
|
consoleX = Console.CursorLeft; consoleY = Console.CursorTop;
|
|
}
|
|
catch { }
|
|
|
|
RegistryKey MyKey = Registry.LocalMachine.OpenSubKey(registryPath);
|
|
int count = 1;
|
|
int tot = 0;
|
|
string PackL = "";
|
|
|
|
foreach (string subkeyname in MyKey.GetSubKeyNames())
|
|
{
|
|
if (!subkeyname.StartsWith("Package"))
|
|
{
|
|
tot += 1;
|
|
}
|
|
}
|
|
foreach (string subkeyname in MyKey.GetSubKeyNames())
|
|
{
|
|
if (!subkeyname.StartsWith("Package"))
|
|
{
|
|
CorrectConsolePostion(tot, consoleY, consoleX);
|
|
|
|
|
|
Console.ForegroundColor = ConsoleColor.Yellow;
|
|
Console.Write("{0}/{1}", count, tot);
|
|
Console.ResetColor();
|
|
PackL += subkeyname + Environment.NewLine;
|
|
count++;
|
|
}
|
|
}
|
|
|
|
|
|
MyKey.Close();
|
|
try
|
|
{
|
|
StreamWriter SW = new StreamWriter(PackLog, true);
|
|
SW.WriteLine(PackL);
|
|
SW.Close();
|
|
}
|
|
catch
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.Write("FAIL");
|
|
Console.ResetColor();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static bool CleanComponentSubkeys(string registryPath, string CN)
|
|
{
|
|
int consoleX = 0; int consoleY = 0;
|
|
try
|
|
{
|
|
consoleX = Console.CursorLeft; consoleY = Console.CursorTop;
|
|
}
|
|
catch { }
|
|
try
|
|
{
|
|
RegistryKey MyKey = Registry.LocalMachine.OpenSubKey(registryPath);
|
|
IdentityReference CurUser = System.Security.Principal.WindowsIdentity.GetCurrent().User;
|
|
int count = 1;
|
|
int tot = 0;
|
|
|
|
foreach (string subkeyname in MyKey.GetSubKeyNames())
|
|
{
|
|
if (subkeyname.Contains(CN)) { tot += 1; }
|
|
}
|
|
Debug.Assert(MyKey != null, "myKey != null");
|
|
|
|
foreach (string subkeyname in MyKey.GetSubKeyNames())
|
|
{
|
|
|
|
if (subkeyname.Contains(CN))
|
|
{
|
|
try
|
|
{
|
|
if (!_cr.Contains(subkeyname)) { _cr += subkeyname + Environment.NewLine; }
|
|
CorrectConsolePostion(tot, consoleY, consoleX);
|
|
|
|
|
|
Console.ForegroundColor = ConsoleColor.Yellow;
|
|
Console.Write("{0}/{1}", count, tot);
|
|
Console.ResetColor();
|
|
|
|
if (!RegSetOwneship(MyKey, subkeyname, CurUser))
|
|
{
|
|
MyKey.Close();
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.WriteLine("FAIL");
|
|
Console.WriteLine("Error at setting key privileges.");
|
|
Console.ResetColor();
|
|
_failed = true;
|
|
Ending();
|
|
}
|
|
RegistryAccessRule ntmp = RegSetFullAccess(MyKey, subkeyname, CurUser);
|
|
|
|
|
|
|
|
RegistryKey nSubKey = MyKey.OpenSubKey(subkeyname, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
|
|
try
|
|
{
|
|
if (Contains<string[], string>(nSubKey.GetValueNames(), "Visibility"))
|
|
{
|
|
if (_vis == false)
|
|
{
|
|
if (!Contains<string[], string>(nSubKey.GetValueNames(), "DefVis")) { nSubKey.SetValue("DefVis", nSubKey.GetValue("Visibility"), RegistryValueKind.DWord); }
|
|
nSubKey.SetValue("Visibility", 0x00000001, RegistryValueKind.DWord);
|
|
}
|
|
else
|
|
{
|
|
if (Contains<string[], string>(nSubKey.GetValueNames(), "DefVis")) { nSubKey.SetValue("Visibility", nSubKey.GetValue("DefVis"), RegistryValueKind.DWord); }
|
|
}
|
|
}
|
|
|
|
if (!_cmdLineArgs.ContainsKey('d'))
|
|
{
|
|
if (Contains<string[], string>(nSubKey.GetSubKeyNames(), "Owners"))
|
|
{
|
|
RegSetOwneship(MyKey, subkeyname + "\\Owners", CurUser);
|
|
RegSetFullAccess(MyKey, subkeyname + "\\Owners", CurUser);
|
|
nSubKey.DeleteSubKey("Owners");
|
|
}
|
|
}
|
|
}
|
|
catch (Exception Ex) { Console.WriteLine(Ex.Message); }
|
|
nSubKey.Close();
|
|
|
|
RegRemoveAccess(MyKey, subkeyname, CurUser, ntmp);
|
|
|
|
}
|
|
catch { }
|
|
count++;
|
|
}
|
|
}
|
|
MyKey.Close();
|
|
}
|
|
catch
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.WriteLine(" FAIL - Key not exist");
|
|
Console.ResetColor();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
static void Ending()
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.White;
|
|
Console.WriteLine("\n-------------------Ending------------------");
|
|
Console.ResetColor();
|
|
if (_online == false)
|
|
{
|
|
if (Contains<string[], string>(Microsoft.Win32.Registry.LocalMachine.GetSubKeyNames(), HIVE_MOUNT_DIR))
|
|
{
|
|
Console.Write("Unmounting key... ");
|
|
if (!UnloadHive(HIVE_MOUNT_POINT))
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.Red;
|
|
Console.WriteLine("FAIL");
|
|
Console.WriteLine("You must unmount registry hive manually.");
|
|
Console.WriteLine("Hit any key to close.");
|
|
Console.ResetColor();
|
|
Console.ReadKey();
|
|
Environment.Exit(-1);
|
|
}
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.ResetColor();
|
|
|
|
}
|
|
|
|
if (File.Exists(_bkpFile) && _failed && !_cmdLineArgs.ContainsKey('n'))
|
|
{
|
|
Console.Write("Restoring Backup... ");
|
|
File.Copy(_bkpFile, _hiveFileInfo, true);
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.ResetColor();
|
|
|
|
|
|
try
|
|
{
|
|
Console.Write("Removing Backup file... ");
|
|
File.Delete(_bkpFile);
|
|
Console.ForegroundColor = ConsoleColor.Green;
|
|
Console.WriteLine("OK");
|
|
Console.ResetColor();
|
|
if (_cmdLineArgs.Count == 0)
|
|
{
|
|
Console.WriteLine("Hit any key to close.");
|
|
Console.ReadKey();
|
|
}
|
|
}
|
|
catch
|
|
{ }
|
|
}
|
|
}
|
|
Environment.Exit(0);
|
|
|
|
}
|
|
|
|
|
|
static void RegRemoveAccess(RegistryKey nParentKey, string nkey, IdentityReference nuser, RegistryAccessRule nacc)
|
|
{
|
|
RegistryKey nSubKey = nParentKey.OpenSubKey(nkey, RegistryKeyPermissionCheck.ReadWriteSubTree,
|
|
RegistryRights.ChangePermissions | RegistryRights.ReadKey);
|
|
RegistrySecurity nSubKeySec = nSubKey.GetAccessControl(AccessControlSections.Access);
|
|
nSubKeySec.RemoveAccessRule(nacc);
|
|
nSubKey.SetAccessControl(nSubKeySec);
|
|
nSubKey.Close();
|
|
}
|
|
|
|
static RegistryAccessRule RegSetFullAccess(RegistryKey nParentKey, string nkey, IdentityReference nuser)
|
|
{
|
|
RegistryKey nSubKey = null;
|
|
try
|
|
{
|
|
|
|
nSubKey = nParentKey.OpenSubKey(nkey, RegistryKeyPermissionCheck.ReadWriteSubTree,
|
|
RegistryRights.ReadKey | RegistryRights.ChangePermissions | RegistryRights.ReadPermissions);
|
|
RegistrySecurity nSubKeySec = nSubKey.GetAccessControl(AccessControlSections.Access);
|
|
RegistryAccessRule nAccRule = new RegistryAccessRule(nuser, RegistryRights.FullControl, AccessControlType.Allow);
|
|
nSubKeySec.AddAccessRule(nAccRule);
|
|
//nSubKeySec.RemoveAccessRul
|
|
nSubKey.SetAccessControl(nSubKeySec);
|
|
nSubKey.Close();
|
|
return nAccRule;
|
|
}
|
|
catch
|
|
{
|
|
nSubKey?.Close();
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static bool RegSetOwneship(RegistryKey nParentKey, string nkey, IdentityReference nuser)
|
|
{
|
|
RegistryKey nSubKey = null;
|
|
try
|
|
{
|
|
nSubKey = nParentKey.OpenSubKey(nkey, RegistryKeyPermissionCheck.ReadWriteSubTree,
|
|
RegistryRights.TakeOwnership | RegistryRights.ReadKey | RegistryRights.ReadPermissions);
|
|
RegistrySecurity nSubKeySec = nSubKey.GetAccessControl(AccessControlSections.Owner);
|
|
nSubKeySec.SetOwner(nuser);
|
|
nSubKey.SetAccessControl(nSubKeySec);
|
|
nSubKey.Close();
|
|
return true;
|
|
}
|
|
catch
|
|
{
|
|
if (nSubKey != null)
|
|
nSubKey.Close();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
static bool Contains<typeColl, typeKey>(typeColl collection, typeKey val)
|
|
where typeColl : IEnumerable<typeKey>
|
|
where typeKey : IComparable
|
|
{
|
|
foreach (typeKey subelement in collection)
|
|
{
|
|
if (subelement.CompareTo(val) == 0)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static void InitProcess(Process nproc)
|
|
{
|
|
nproc.StartInfo.UseShellExecute = false;
|
|
nproc.StartInfo.RedirectStandardError = true;
|
|
nproc.StartInfo.RedirectStandardOutput = true;
|
|
nproc.StartInfo.RedirectStandardInput = true;
|
|
nproc.StartInfo.CreateNoWindow = true;
|
|
}
|
|
|
|
static bool LoadHive(string nfile, string nkeyname)
|
|
{
|
|
return RunReg(string.Format("LOAD {0} {1}", nkeyname, "\"" + nfile + "\""));
|
|
}
|
|
static bool UnloadHive(string nkeyname)
|
|
{
|
|
return RunReg(string.Format("UNLOAD {0}", nkeyname));
|
|
}
|
|
static bool RunReg(string nArguments)
|
|
{
|
|
Process reg = new Process();
|
|
InitProcess(reg);
|
|
reg.StartInfo.FileName = "reg.exe";
|
|
reg.StartInfo.Arguments = nArguments;
|
|
reg.Start();
|
|
reg.WaitForExit();
|
|
string RegOutput = reg.StandardOutput.ReadToEnd();
|
|
string RegError = reg.StandardError.ReadToEnd();
|
|
if ((RegOutput.Length < 1) || (RegError.Length > 1))
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
private static void CorrectConsolePostion(int tot, int consoleY, int consoleX)
|
|
{
|
|
try
|
|
{
|
|
Console.CursorLeft = consoleX;
|
|
Console.CursorTop = consoleY;
|
|
|
|
if (tot < 10)
|
|
{
|
|
Console.CursorLeft = consoleX;
|
|
Console.CursorTop = consoleY;
|
|
}
|
|
if (tot > 9 && tot < 100)
|
|
{
|
|
Console.CursorLeft = consoleX - 2;
|
|
Console.CursorTop = consoleY;
|
|
}
|
|
if (tot > 99 && tot < 1000)
|
|
{
|
|
Console.CursorLeft = consoleX - 4;
|
|
Console.CursorTop = consoleY;
|
|
}
|
|
if (tot > 999 && tot < 10000)
|
|
{
|
|
Console.CursorLeft = consoleX - 6;
|
|
Console.CursorTop = consoleY;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
|
|
static Dictionary<char, string> ProcessCmdArgs(string[] args, char[] allowedArgs)
|
|
{
|
|
Dictionary<char, string> tmp = new Dictionary<char, string>();
|
|
string curV = "";
|
|
string argtmp;
|
|
char curK = ' ';
|
|
foreach (string arg in args)
|
|
{
|
|
argtmp = arg.Trim();
|
|
if (argtmp[0] == '/')
|
|
{
|
|
if (Contains<char[], char>(allowedArgs, argtmp[1]))
|
|
{
|
|
if (curK != ' ')
|
|
tmp.Add(curK, curV.Trim());
|
|
curK = arg[1];
|
|
curV = "";
|
|
}
|
|
else
|
|
{
|
|
tmp.Clear();
|
|
tmp.Add('?', "");
|
|
return tmp;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (curK == ' ')
|
|
{
|
|
tmp.Clear();
|
|
tmp.Add('?', "");
|
|
return tmp;
|
|
}
|
|
curV += " " + argtmp;
|
|
}
|
|
}
|
|
tmp.Add(curK, curV.Trim());
|
|
return tmp;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
#region License
|
|
|
|
/* Copyright (c) 2008 Michał Wnuowski
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to
|
|
* deal in the Software without restriction, including without limitation the
|
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
* sell copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
|
|
#endregion
|
|
|
|
#region Contact
|
|
|
|
/*
|
|
* Michał Wnuowski
|
|
* Email: wnuku1@hotmail.com
|
|
*/
|
|
|
|
#endregion
|