Я ищу скрипт, который может найти раздел реестра и удалить его. Мой ключ: "{24EAA2C1-3EE7-40E0-AEA3-D20AA14A6005}". THis ключ хранится во многих местах:Найти и удалить раздел реестра в C#
HKEY_CLASSES_ROOT\CLSID\{MY_KEY}
HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{MY_KEY}
HKEY_CURRENT_USER\Software\Classes\CLSID\{MY_KEY}
HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{MY_KEY}
HKEY_USERS\S-1-5-21-1786904987-2011555162-1551513139-1001\Software\Classes\CLSID\{MY_KEY}
HKEY_USERS\S-1-5-21-1786904987-2011555162-1551513139-1001\Software\Classes\Wow6432Node\CLSID\{KEY}
HKEY_USERS\S-1-5-21-1786904987-2011555162-1551513139-1001_Classes\CLSID\{MY_KEY}
HKEY_USERS\S-1-5-21-1786904987-2011555162-1551513139-1001_Classes\Wow6432Node\CLSID\{MY_KEY}
Но эти места могут меняться (это причина, почему я должен найти их, прежде чем удалить их). Я хотел бы, чтобы удалить каждые места где этот ключ, используя C# сценария (в консольном приложении)
Я попытался это:
Я получаю сообщение об ошибке:
Can not delete a subkey, because it does not exist.
EDIT
Это мой код, который используется для поиска всех событий ключа:
public List<string> SearchKey(string Key)
{
List<string> ListKeys = getKeyPath(Key, RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64));
ListKeys.AddRange(getKeyPath(Key, RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64)));
ListKeys.AddRange(getKeyPath(Key, RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)));
ListKeys.AddRange(getKeyPath(Key, RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Registry64)));
ListKeys.AddRange(getKeyPath(Key, RegistryKey.OpenBaseKey(RegistryHive.CurrentConfig, RegistryView.Registry64)));
return ListKeys;
}
private List<string> getKeyPath(string key, RegistryKey registryKey)
{
List<string> keys = new List<string>();
if (CanReadRegistryKey(registryKey))
{
foreach (string keyname in registryKey.GetSubKeyNames())
{
if (keyname.Contains(key))
keys.Add(registryKey.Name + "\\" + keyname);
if (CanReadKey(registryKey, keyname))
keys.AddRange(getKeyPath(key, registryKey.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadSubTree)));
}
}
return keys;
}
private bool CanReadRegistryKey(RegistryKey registryKey)
{
try
{
registryKey.GetSubKeyNames();
return true;
}
catch (UnauthorizedAccessException e)
{
return false;
}
}
private bool CanReadKey(RegistryKey registryKey, string keyname)
{
try
{
registryKey.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadSubTree);
return true;
}
catch (SecurityException e)
{
return false;
}
}
Использование:
List<string> ListKeys = SearchKey("MY_KEY");
Я не всегда получаю тот же результат. Иногда я получаю найдено 7 ключей, иногда 8. (недостающее ключ HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID {MY_KEY})
Вот мой код для удаления:
public int RemoveKey(string Key)
{
int count = RemoveKeys(Key, RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64));
count += RemoveKeys(Key, RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64));
count += RemoveKeys(Key, RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64));
count += RemoveKeys(Key, RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Registry64));
count += RemoveKeys(Key, RegistryKey.OpenBaseKey(RegistryHive.CurrentConfig, RegistryView.Registry64));
return count;
}
private int RemoveKeys(string key, RegistryKey registryKey)
{
int count = 0;
if (CanReadRegistryKey(registryKey))
{
foreach (string keyname in registryKey.GetSubKeyNames())
{
count += RemoveKeys(key, registryKey.OpenSubKey(keyname));
try
{
if (keyname.Contains(key))
{
registryKey.DeleteValue(keyname);
count++;
}
}
catch (Exception e)
{
}
}
}
return count;
}
Использование:
int NumberOfRemovedKeys = RemoveKey("MY_KEY");
Но я Аллуэй получил ошибку на этом коде: сообщение
registryKey.DeleteValue(keyname);
ошибка:
System.UnauthorizedAccessException: Can not write to the registry key.
У меня такая же ошибка, когда я пытаюсь запустить приложение в режиме администратора. Но когда я пытаюсь удалить manualy ключ из regedit, нет проблем.
В поле «поиск» я получил список ключей с полным путем. Я попытался удалить ключ напрямую, используя полный путь, но это невозможно, потому что RegistryKey должен быть инициализирован с помощью RegistryHive (например, RegistryHive.ClassesRoot), но RegistryHive уже находится в полном пути.
Как я могу получить разрешение на удаление?