2013-08-30 8 views
2

Я ищу скрипт, который может найти раздел реестра и удалить его. Мой ключ: "{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 уже находится в полном пути.

Как я могу получить разрешение на удаление?

ответ

Смежные вопросы