Доступ к записи реестра из процесса, запущенного с помощью метода System.Diagnostics.Process.Start () - PullRequest
1 голос
/ 26 апреля 2010

Через установщик моего настольного приложения (код C #) я хочу выполнить внешний процесс. Я делаю это, используя следующий код.

            ProcessStartInfo sinfo = new ProcessStartInfo();
            sinfo.FileName = filePath;
            sinfo.WorkingDirectory = workingDir;
            sinfo.UseShellExecute = false;
            using (Process proc = Process.Start(sinfo))
            {
                proc.WaitForExit();
                int code = proc.ExitCode;
            }

Мой внешний процесс в основном пытается прочитать запись в реестре и обработать что-то с ней (он только читает, но не записывает в регистр).

Хотя я подтверждаю, что установочные значения реестра уже были обновлены установщиком (и я могу вручную прочитать записи reg через regedit), внешний процесс не может их прочитать. Его пытаются читать следующим образом:

                using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(regKey))
                {
                    return (string)rk.GetValue(subKey);
                }

Когда я ставлю точку останова в приведенных выше строках, я вижу, что в rk нет подключей. Я делаю все это в Win7 env (не знаю, вызывает ли UAC проблемы)

Теперь, когда я напрямую запускаю внешнее приложение вручную (т.е. дважды нажимаю на exe приложения), я могу легко читать записи reg. Похоже, что я делаю что-то не так при запуске процесса. У кого-нибудь есть идеи, что?

Спасибо, Капил

1 Ответ

0 голосов
/ 28 апреля 2010

У вас может быть проблема с доступом.

Попробуйте заполнить свойства sinfo.username и sinfo.password и убедитесь, что пользователь с правами администратора запускает процесс

 ProcessStartInfo sinfo = new ProcessStartInfo();
        sinfo.FileName = filePath;
        sinfo.WorkingDirectory = workingDir;
        sinfo.UseShellExecute = false;
        sinfo.UserName = "username1";
        SecureString password = new SecureString();
        foreach (char c in "password1".ToCharArray()) {
           password.AppendChar(c);
        }
        sinfo.Password = password;
        using (Process proc = Process.Start(sinfo))
        {
            proc.WaitForExit();
            int code = proc.ExitCode;
        }
...