2016-06-29 7 views
0

Ich versuche, Registrierungsschlüssel und seine Unterschlüssel zu löschen. Meine Methode nimmt einen Registrierungsschlüssel als Zeichenfolgenargument und sucht und löscht sie dann.Warum kann ich einen Registrierungsschlüssel nicht löschen, obwohl er vorhanden ist?

Ich teste es mit diesem Schlüssel:

HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ Windows \ Currentversion \ Uninstall \ {InstallShield_ 694AFFC3-93D4-4049-AF26-78739488EB4D}

und das ist die Methode, die ich geschrieben habe:

static void RemoveRegKey(string registryKey) 
{ 
    // Split the string to get the hive, middle section, and subkey name 
    string[] regKeyParts = registryKey.Split('\\'); 
    // Hive 
    string hive = regKeyParts[0].ToUpper(); 
    // Name 
    string name = regKeyParts[regKeyParts.Length - 1]; 
    // Middle bit 
    string keyPath = ""; 
    for (int i = 1; i < regKeyParts.Length - 1; i++) 
    { 
    keyPath = keyPath + regKeyParts[i] + "\\"; 
    } 

    // Create my registry key 
    RegistryKey regkey = null; 
    switch (hive) 
    { 
    case ("HKEY_LOCAL_MACHINE"): 
     regkey = Registry.LocalMachine; 
     break; 
    case ("HKEY_CURRENT_CONFIG"): 
     regkey = Registry.CurrentConfig; 
     break; 
    case ("HKEY_CURRENT_USER"): 
     regkey = Registry.CurrentUser; 
     break; 
    case ("HKEY_USERS"): 
     regkey = Registry.Users; 
     break; 
    case ("HKEY_CLASSES_ROOT"): 
     regkey = Registry.ClassesRoot;  
     break; 
    } 

    // Open the registry key (everything up to the parent of the key I want to delete 
    using (RegistryKey rk = regkey.OpenSubKey(keyPath, true)) 
    { 
     Console.WriteLine(rk.ToString()); 
     // This bit added to verify the subkey is present - it will output to console if found 
     string[] sk = rk.GetSubKeyNames(); 
     foreach (string s in sk) 
     { 
      if (s == name) { Console.WriteLine(s); } 
     } 

     // If the subkey is present, delete it 
     if (regkey.OpenSubKey(name) != null) 
     { 
      Console.WriteLine("Registry key found - deleting it"); 
      regkey.DeleteSubKeyTree(name); 
     } 
     else 
     { 
      Console.WriteLine("Could not find reg key"); 
     } 
    }  
} 

der Schlüssel ist auf jeden Fall vorhanden, wie diese Rubrik:

string[] sk = rk.GetSubKeyNames(); 
foreach (string s in sk) 
{ 
    if (s == name) { Console.WriteLine(s); } 
} 

gibt die erwartete Ausgabe in grün dargestellt hier:

enter image description here

jedoch regkey.OpenSubKey(name) ausgewertet null, als die Ausgabe nach zeigt.

Konnte Schlüssel reg nicht finden.

Ich führe dies als ein erhöhter Benutzer, und der Schlüssel ist nicht geschützt.

+0

überprüfen Sie dies: http://stackoverflow.com/questions/13728491/opensubkey-returns-null-for-a-registry-key-that-i-can-see-in-regedit-exe – Dexion

Antwort

2

Ist es ein Fehler im Code? Sollte dies;

if (regkey.OpenSubKey(name) != null) 

if (rk.OpenSubKey(name) != null) 

werden, und das Löschen aktualisieren.

+0

Wow, guter Platz ! –

+0

@Rhys Jones - Brilliant! (Jetzt fühle ich mich albern ....) – Ben

+0

@Ben war da, das getan :) –

0

Höchstwahrscheinlich ist dies ein 32/64 Bit Problem. Versuchen Sie entweder

  1. Ausführen der Anwendung in 64-Bit-Modus, dann den Registrierungspfad verwenden, die WOW6432Node

oder

umfasst
  1. Kompilieren und Ausführen der Anwendung Im 32-Bit-Modus entfernen Sie dann den WOW6432Node-Teil aus dem Pfad, da dieser transparent für die Anwendung zugeordnet wird.

Darüber hinaus überprüfen Sie bitte Rhys Jones' Antwort ...

Verwandte Themen