using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
namespace Regedit
{
class RegistryUtils
{
public static RegistryKey OpenKeyFromPath(string keyPath, bool writableKey)
{
if (string.IsNullOrEmpty(keyPath))
return null;
string[] pathElements = keyPath.Split(new[] { '\\' });
// Getting the first element
string rootKeyName = pathElements[0];
string subPath = keyPath.IndexOf('\\') == -1 ? keyPath : keyPath.Substring(keyPath.IndexOf('\\'));
try
{
if (pathElements.Length == 1) // Root nodes have been selected.
{
if (rootKeyName == Registry.ClassesRoot.Name)
return Registry.ClassesRoot;
else if (rootKeyName == Registry.CurrentUser.Name)
return Registry.CurrentUser;
else if (rootKeyName == Registry.LocalMachine.Name)
return Registry.LocalMachine;
else if (rootKeyName == Registry.Users.Name)
return Registry.Users;
}
else
{
if (rootKeyName == Registry.ClassesRoot.Name)
return Registry.ClassesRoot.OpenSubKey(subPath, writableKey);
else if (rootKeyName == Registry.CurrentUser.Name)
return Registry.CurrentUser.OpenSubKey(subPath, writableKey);
else if (rootKeyName == Registry.LocalMachine.Name)
return Registry.LocalMachine.OpenSubKey(subPath, writableKey);
else if (rootKeyName == Registry.Users.Name)
return Registry.Users.OpenSubKey(subPath, writableKey);
}
return null;
}
catch
{
return null;
}
}
///
/// Renames a subkey of the passed in registry key since
/// the Framework totally forgot to include such a handy feature.
///
/// The RegistryKey that contains the subkey
/// you want to rename (must be writeable)
/// The name of the subkey that you want to rename
///
/// The new name of the RegistryKey
/// True if succeeds
public static bool RenameSubKey(RegistryKey parentKey,
string subKeyName, string newSubKeyName)
{
CopyKey(parentKey, subKeyName, newSubKeyName);
parentKey.DeleteSubKeyTree(subKeyName);
parentKey.Flush();
return true;
}
///
/// Copy a registry key. The parentKey must be writeable.
///
///
///
///
///
public static bool CopyKey(RegistryKey parentKey,
string keyNameToCopy, string newKeyName)
{
//Create new key
RegistryKey destinationKey = parentKey.CreateSubKey(newKeyName);
//Open the sourceKey we are copying from
RegistryKey sourceKey = parentKey.OpenSubKey(keyNameToCopy, true);
RecurseCopyKey(sourceKey, destinationKey);
return true;
}
private static void RecurseCopyKey(RegistryKey sourceKey, RegistryKey destinationKey)
{
//copy all the values
foreach (string valueName in sourceKey.GetValueNames())
{
object objValue = sourceKey.GetValue(valueName);
RegistryValueKind valKind = sourceKey.GetValueKind(valueName);
destinationKey.SetValue(valueName, objValue, valKind);
}
//For Each subKey
//Create a new subKey in destinationKey
//Call myself
foreach (string sourceSubKeyName in sourceKey.GetSubKeyNames())
{
RegistryKey sourceSubKey = sourceKey.OpenSubKey(sourceSubKeyName, true);
RegistryKey destSubKey = destinationKey.CreateSubKey(sourceSubKeyName);
RecurseCopyKey(sourceSubKey, destSubKey);
}
// Close it when finished so it can be deleted later in the final step
sourceKey.Close();
destinationKey.Close();
}
}
}