web-dev-qa-db-fra.com

Écriture dans le registre dans une application C #

J'essaie d'écrire dans le registre à l'aide de mon application C #.

J'utilise la réponse donnée ici: Écriture de valeurs dans le registre avec C #

Cependant, pour une raison quelconque, la clé n'est pas ajoutée au registre.

J'utilise le code suivant:

string Timestamp = DateTime.Now.ToString("dd-MM-yyyy");

string key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\"+Application.ProductName+"\\"+Application.ProductVersion;
string valueName = "Trial Period";

Microsoft.Win32.Registry.SetValue(key, valueName, Timestamp, Microsoft.Win32.RegistryValueKind.String);

Le Application.name et Application.version 'dossiers' n'existe pas encore.

Dois-je les créer d'abord?

En outre, je le teste sur une version 64b Win, donc je pense que si je veux vérifier le registre pour la clé ajoutée, je dois vérifier spécifiquement le registre 32 bits dans: C:\Windows\SysWOW64\regedit.exe, n'est-ce pas? ?

39
PeeHaa

Tout d'abord, si vous souhaitez modifier la clé sous LocalMachine, vous devez exécuter votre application sous les droits d'administrateur (mieux utiliser CurrentUser, c'est plus sûr ou créer la clé dans le programme d'installation). Vous devez également ouvrir la clé en mode édition (méthode OpenSubKey) pour ajouter de nouvelles sous-clés. J'ai vérifié le code et ça marche. Voici le code.

RegistryKey key = Registry.LocalMachine.OpenSubKey("Software",true);

key.CreateSubKey("AppName");
key = key.OpenSubKey("AppName", true);


key.CreateSubKey("AppVersion");
key = key.OpenSubKey("AppVersion", true);

key.SetValue("yourkey", "yourvalue");
60
Silx

Vérifiez également si vos appels de registre sont virtualisés. Voir ici pour plus d'informations.

Cela peut se produire si votre application n'est pas compatible UAC et se produit pour des raisons de compatibilité.

Real path
HKEY_LOCAL_MACHINE\Software\FooKey

Virtual path
HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software\FooKey
6
TheCodeKing

Vous pouvez utiliser le code suivant pour créer et ouvrir les clés de registre requises.

RegistryKey SoftwareKey   = Registry.LocalMachine.OpenSubKey("Software",true);

RegistryKey AppNameKey    = SoftwareKey.CreateSubKey("AppName");
RegistryKey AppVersionKey = AppNameKey.CreateSubKey("AppVersion");

AppVersionKey.SetValue("yourkey", "yourvalue");

Vous pouvez essentiellement utiliser CreateSubKey pour tous les paramètres de votre application, car cela ouvrira la clé pour l'accès en écriture, si elle existe déjà, et la créera autrement. Il n'est pas nécessaire de créer d'abord, puis d'ouvrir. OpenSubKey est utile lorsque vous êtes absolument certain que la clé existe déjà, comme dans ce cas, avec "HKEY_LOCAL_MACHINE\SOFTWARE \"

3
Wracky

Essayez d'ouvrir HKLM\Software première. Créez ensuite la clé de votre programme, puis créez la clé de la version. Cependant, votre clé pourrait être placée dans HKLM\software\WOW6432Node. Vérifiez ça.

2
Viktorianec

Le problème est que vous n'avez pas assez de privilèges. Voici une méthode qui fonctionne pour moi:

RegistryKey myKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
myKey = myKey.OpenSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);

if (myKey != null)
{
    myKey.SetValue("DefaultPrinterId", ldiPrinters[e.RowIndex].id, RegistryValueKind.String);
    myKey.Close();
}

Avec RegistryKey.OpenBaseKey vous ouvrez le registre correct, car lorsque vous n'avez pas les autorisations du registre que vous écrivez, il le fait dans un autre emplacement.

1
Rey Cruz