Подтвердить что ты не робот

С# - импортировать файл reg в реестр без окна подтверждения пользователя

С# winforms - Как импортировать файл reg в реестр? Следующий код отображает окно подтверждения пользователю (да/нет).

Process regeditProcess = Process.Start("key.reg", "/S /q"); // not working
regeditProcess.WaitForExit(); 
4b9b3361

Ответ 1

Отправьте файл в качестве параметра regedit.exe:

Process regeditProcess = Process.Start("regedit.exe", "/s key.reg");
regeditProcess.WaitForExit();

Ответ 2

Код в ответе 2 правильный, но не полный. Он будет работать, когда каталог, в котором вы ссылаетесь, не имеет пробелов в пути/файле, который вы ссылаетесь на пример C:\ProgramFiles\key.reg, будет работать нормально, но C:\Program Files\key.reg НЕ РАБОТАЕТ потому что на пути есть пробелы.

Решение:

string directory= @"C:\Program Files (x86)\key.reg";
Process regeditProcess = Process.Start("regedit.exe", "/s \"" + directory + "\"");
regeditProcess.WaitForExit();

Ответ 3

Я попытался вызвать RegEdit, но каждый раз, когда я получал подсказку подтверждения (UAC включен, никаких повышенных разрешений). Вместо RegEdit я рекомендую "reg.exe" (который включен в Windows с XP)

            Process proc = new Process();

            try
            {
                proc.StartInfo.FileName = "reg.exe";
                proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                proc.StartInfo.CreateNoWindow = true;
                proc.StartInfo.UseShellExecute = false;

                string command = "import " + path;
                proc.StartInfo.Arguments = command;
                proc.Start();

                proc.WaitForExit();
            }
            catch (System.Exception)
            {
                proc.Dispose();
            }

Нет диалога, нет приглашения.

Команда - это что-то вроде "reg import path/to/the/reg.reg"

Ответ 4

Вместо выполнения файла .reg вы можете внести свои изменения в реестр, используя функции, указанные в Microsoft.Win32 namespace.

Для создать раздел реестра довольно легко, используя этот API:

RegistryKey key = Registry.CurrentUser.CreateSubKey("Names");
key.SetValue("Name", "Isabella");
key.Close();

Если вам не нужно создавать массовую загрузку новых ключей, я считаю, что API является более масштабируемым и универсальным. Если в какой-то момент вам нужно будет сделать необязательным запись ваших настроек в общесистемной или отдельной ветки реестра, большая часть вашего кода будет повторно использоваться для обоих случаев. Просто выберите другой ключ, чтобы внести изменения.

Возможно, что более важно, API позволяет точно указать (в коде), как обрабатывать случаи, когда ключ (ключи), которые вы вставляете, уже существует в реестре. Должен ли я удалять существующие ключи и вставлять мои данные, обновлять значения в существующих ключах, молча игнорировать или создавать исключение?