Problema de ação personalizada do instalador - Não é possível escrever para registrar a chave
-
21-09-2019 - |
Pergunta
No editor de ações personalizadas, adicionei a ação personalizada para instalar e desinstalar os estágios do processo. Na janela Propriedades, marquei a propriedade CustomActionData como:
/TARGETDIR = "[TARGETDIR]"
Espero que o exposto acima passe as informações do diretório de instalação para a ação personalizada.
A ação personalizada parece estar disparando, mas estou recebendo a seguinte mensagem de erro:
"Erro 1001. Não é possível escrever para a chave do registro" (Ou algo assim, estou traduzindo -o do meu idioma local).
O que estou fazendo errado?
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
//using System.Windows.Forms;
using Microsoft.Win32;
namespace CustomActions
{
[RunInstaller(true)]
public partial class Installer1 : Installer
{
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
const string key_path = "SOFTWARE\\VendorName\\MyAppName";
const string key_value_name = "InstallationDirectory";
RegistryKey key = Registry.LocalMachine.OpenSubKey(key_path);
if (key == null)
{
key = Registry.LocalMachine.CreateSubKey(key_path);
}
string tgt_dir = Context.Parameters["TARGETDIR"];
key.SetValue(key_value_name, tgt_dir);
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
const string key_path = "SOFTWARE\\VendorName";
const string key_name = "MyAppName";
RegistryKey key = Registry.LocalMachine.OpenSubKey(key_path);
if (key.OpenSubKey(key_name) != null)
{
key.DeleteSubKey(key_name);
}
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
}
public Installer1()
{
InitializeComponent();
}
}
}
Solução
Tente mudar:
RegistryKey key = Registry.LocalMachine.OpenSubKey(key_path);
Para:
RegistryKey key = Registry.LocalMachine.OpenSubKey(key_path, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree);