C # obtenir le statut de SystemRestore à partir du registre

J’essaie de lire la clé de registre “RPSessionInterval” à partir de la sous-clé “HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore” en C #. J’utilise le code suivant et obtenir l’exception “La référence d’object n’est pas définie sur une instance d’un object.”

ssortingng systemRestore = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore"; RegistryKey baseRegistryKey = Registry.LocalMachine; public ssortingng SystemRestoreStatus(ssortingng subKey, ssortingng keyName) { RegistryKey rkSubKey = baseRegistryKey.OpenSubKey(systemRestore); if (rkSubKey != null) { try { ssortingng sysRestore = rkSubKey.GetValue("RPSessionInterval").ToSsortingng(); if (ssortingng.Compare(sysRestore, "1") == 0) { MessageBox.Show("System Restore is Enabled!"); return "System Restore is Enabled!"; } else if (ssortingng.Compare(sysRestore, "0") == 0) { MessageBox.Show("System Restore is Disabled!"); return "System Restore is Disabled!"; } else { return null; } } catch (Exception ex) //This exception is thrown { MessageBox.Show("Error while reading registry key: " + subKey + "\\" + keyName + ". ErrorMessage: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } } else { MessageBox.Show("Error while reading registry key: " + subKey + "\\" + keyName + " does not exist!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } } 

Voici une image montrant que la clé de registre existe réellement:

Image

Vous avez probablement le mauvais bitness pour votre application C #. Par défaut, un projet Visual Studio 2010 C # sera compilé en x86 (32 bits) . Une application 32 bits s’exécutant sur un système d’exploitation 64 bits ne peut généralement accéder qu’au registre 32 bits, dont le contenu est souvent différent de celui du registre 64 bits natif . Modifiez l’architecture à “Any CPU” ou “x64” et cela peut fonctionner.

Vous avez probablement un problème d’orthographe pour l’appel à SystemRestoreStatus, qui provoque l’exception sur la ligne suivante:

 ssortingng sysRestore = rkSubKey.GetValue(keyName).ToSsortingng(); 

Si vous ne savez pas si la valeur existera ou non, vous pouvez modifier cette ligne à:

 ssortingng sysRestore = rkSubKey.GetValue(keyName) as ssortingng; 

puis testez pour voir si la chaîne est nulle ou vide avant d’essayer de l’utiliser.

Mettre à jour

Une autre possibilité est que vous exécutez le code à partir d’une application 32 bits sur un système d’exploitation 64 bits. Dans ce cas, .Net redirige utilement votre requête vers le

 SOFTWARE\Wow6432Node\Microsoft\... 

noeud à la place.

Vous pouvez contourner ce problème en utilisant RegistryKey.OpenBaseKey en utilisant RegistryView.Registry64 comme second paramètre.