C# - 在不弹出用户确认框的情况下将 reg 文件导入注册表

33

C# WinForms - 我如何将一个reg文件导入到注册表中?以下代码会向用户显示确认框(是/否)。

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

8
他为什么不应该这样做? - Lasse V. Karlsen
4个回答

53

将文件作为参数发送到 regedit.exe

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

10
一个有用的提示:如果文件名带空格,就像在命令行上一样,请确保用引号将其括起来。 - doobop

15
答案:

第二个回答中的代码是正确的,但不完整。当你引用的目录路径/文件路径中存在空格时,它将无法正常工作,例如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();

8

我尝试打开RegEdit,但每次都弹出确认提示(UAC已启用,没有提升权限)。建议使用"reg.exe"代替RegEdit(自Windows XP以来已包含在Windows中)。

            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”。

警告:使用此方法在Virustotal扫描您的应用程序后,可能会出现名为HEUR/QVM03.0.0000.Malware.Gen的恶意软件。 - newbieguy

6

不要执行.reg文件,你应该使用Microsoft.Win32 命名空间提供的功能来更改注册表。

使用这个API创建注册表键非常容易:create a registry key.

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

除非您需要创建大量新密钥,否则我认为API是一种更可扩展且易于维护的方法。如果在某个时刻,您需要决定将设置写入系统范围或每个用户分支的注册表中,则大多数代码都可重用于两种情况。只需选择另一个密钥进行更改即可。
也许更重要的是,API允许您在代码中精确指定如何处理插入的密钥已经存在于注册表中的情况。是否删除现有密钥并插入我的密钥,更新现有密钥中的值,静默忽略或引发异常?

3
他使用API的特定原因是什么? - Lasse V. Karlsen
1
假设操作者需要安装一个官方补丁,这是一个巨大的注册表文件。总会有合理的理由去做某些事情。 - Kobi
1
我可以看出这是一个巨大的注册表文件。因此,为每个设置setValue可能会很痛苦。 - User6996
2
我同意你们三个人的观点,在某些情况下,使用reg是正确的选择,并且我已经更新了我的回答,并提供了一些为什么/何时使用API的论据。 - Jørn Schou-Rode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接