Проект установки .NET — изменение параметров реестра

У меня есть класс, который изменяет ключи реестра ProxyEnable и ProxyServer в настройках Интернета.

Если я использую этот класс в консольном приложении и запускаю его, значение изменяется, и я могу видеть изменения с помощью regedit.

Теперь часть, которая не работает, заключается в том, что я пытаюсь использовать этот класс в классе установщика, чтобы ключи реестра изменялись во время установки моего приложения.

Вот код класса:

public class ProxySettings {
    [DllImport("wininet.dll")]
    public static extern bool InternetSetOption(IntPtr hInternet, int dwOption,
        IntPtr lpBuffer, int dwBufferLength);
    public const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
    public const int INTERNET_OPTION_REFRESH = 37;
    static bool settingsReturn, refreshReturn;

    public void EnableProxy(string proxy) {
        RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
        registry.SetValue("ProxyEnable", 1);
        registry.SetValue("ProxyServer", proxy);

        settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED,
            IntPtr.Zero, 0);
        refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
    }

    public void DisableProxy() {
        RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
        registry.SetValue("ProxyEnable", 0);
        registry.DeleteValue("ProxyServer", false);

        settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED,
            IntPtr.Zero, 0);
        refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
    }
}

Вот мой класс установщика:

[RunInstaller(true)]
public class WindowsServiceInstaller : Installer {
    public WindowsServiceInstaller() {
        ServiceProcessInstaller serviceProcessInstaller =
                           new ServiceProcessInstaller();
        ServiceInstaller serviceInstaller = new ServiceInstaller();

        //# Service Account Information
        serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
        serviceProcessInstaller.Username = null;
        serviceProcessInstaller.Password = null;

        //# Service Information
        serviceInstaller.DisplayName = "Client Service";
        serviceInstaller.StartType = ServiceStartMode.Automatic;

        //# This must be identical to the WindowsService.ServiceBase name
        //# set in the constructor of WindowsService.cs
        serviceInstaller.ServiceName = "Client Service";

        this.Installers.Add(serviceProcessInstaller);
        this.Installers.Add(serviceInstaller);
    }

    public override void Commit(System.Collections.IDictionary savedState) {
        base.Commit(savedState);

        ServiceController controller = new ServiceController("Client Service");
        if(controller.Status != ServiceControllerStatus.Running) {
            controller.Start();
        }

        ProxySettings proxy = new ProxySettings();
        proxy.EnableProxy("127.0.0.1:8889");
    }

    public override void Uninstall(System.Collections.IDictionary savedState) {
        base.Uninstall(savedState);

        ProxySettings proxy = new ProxySettings();
        proxy.DisableProxy();
    }
}

В переопределении Commit я запускаю службу, которая работает нормально, но по какой-то причине я не вижу изменений в реестре.

Просто убедитесь, что класс инициализируется и стреляет, я добавил

System.Diagnostics.Process.Start("http://www.microsoft.com");

для обоих методов EnableProxy и DisableProxy. Во время установки сайт открывался, а также во время удаления, но реестр оставался без изменений.

Что я делаю неправильно? Почему он будет работать как консольное приложение, но не в установщике?


person modernzombie    schedule 15.01.2010    source источник


Ответы (2)


Я не могу точно сказать, почему это работает в консольном приложении, а не в установщике, но я заметил, что вы не удаляете и не очищаете раздел реестра напрямую.

Попробуйте заменить код в EnableProxy на этот (и аналогично DisableProxy) и посмотрите, что получится:

using (RegistryKey registry = Registry.CurrentUser.OpenSubKey(
    "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true))
{
    registry.SetValue("ProxyEnable", 1);
    registry.SetValue("ProxyServer", proxy);
}

(Это одна из многих причин, почему всегда следует удалять IDisposable)

person Aaronaught    schedule 18.01.2010
comment
Спасибо за предложение. Однако это не имело значения. - person modernzombie; 18.01.2010

Хорошо, я понял, что происходит.

У меня был установлен установщик для установки для всех. Я попытался установить и выбрать Just Me, и это сработало.

Я думаю, это имеет смысл, так как я устанавливал раздел реестра для текущего пользователя, но устанавливал для всех. Это звучит правильно?

В любом случае, теперь мне нужно провести еще несколько тестов, чтобы убедиться, что программное обеспечение будет работать правильно, если оно установлено для Just Me. Приложение является службой Windows.

person modernzombie    schedule 18.01.2010
comment
Это имеет смысл — когда вы устанавливаете «Для всех», он будет устанавливаться под профилем «Все пользователи», а не текущим профилем пользователя, поэтому Registry.CurrentUser не будет там, где вы хотите. - person Aaronaught; 18.01.2010