我正在为我工作的公司创建一个应用程序,该应用程序将备份我们提供的某些软件的数据。它具有将SQL数据库,文件夹,文件和注册表项添加到备份作业的选项,然后将其放入Zip文件中。还可以选择在需要时还原备份。
我遇到了注册表备份和还原问题。我已经经历了许多迭代尝试让它工作,但我已经以最能说明我的问题的方式对其进行了简化,希望有人可以提供帮助。
基本上我通过使用带命令行参数的regedit.exe导入“.reg”文件。我试过通过使用ProcessStartInfo()构建它,但它没有用。因此,为了测试问题,我正在创建一个批处理文件,并按如下方式运行它:
File.WriteAllText("ImportReg.bat", "regedit /s /i MyRegFile.reg");
Process.Start("ImportReg.bat");
然而,这不起作用。
批处理文件已成功创建且REG文件有效。这两个文件都与EXE位于同一个位置,所以我认为问题不在于使用哪个目录。如果我自己从这个位置运行批处理文件,它会成功导入注册表文件。我是我正在测试它的机器上的完整管理员。
我也有从注册表导出的问题。注册表的某些部分导出正常,而其他部分则没有。但是,如果我将导出设置为像上面导入的批处理文件那么它每次都有效。
任何人都可以帮忙吗?我看不出为什么我的批处理文件有效,但是当它通过Process.Start运行时却看不到。任何建议都会受到大力赞赏。
答案 0 :(得分:1)
这可能是权限问题吗?
双击时,Regedit会自动升级。但是当你的程序运行时,它不是。也许这就是为什么它允许你出口部门的某些部分,而不是其他部分。
答案 1 :(得分:0)
当程序运行时,即使登录用户是管理员,也不会使用提升的权限运行。 选项A)更改Process.Start以使用'runas'来提升创建的流程
...
using System.Diagnostics;
...
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "C:\\Windows\\system32\\notepad.exe";
proc.StartInfo.Verb = "runas"; // Elevate the application
proc.StartInfo.UseShellExecute = true;
proc.Start();
选项B)通过添加清单文件来提升权限
http://msdn.microsoft.com/en-us/library/bb384691.aspx
在Visual Studio开发环境中设置此链接器选项
清单文件看起来像这样
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3">
<v3:security>
<v3:requestedPrivileges>
<v3:requestedExecutionLevel level="requireAdministrator"/>
</v3:requestedPrivileges>
</v3:security>
</v3:trustInfo>
</assembly>
选项C),添加以下代码(使用动词运行,用它的参数重新生成程序以提升重复的子进程) Windows 7 and Vista UAC - Programmatically requesting elevation in C#
答案 2 :(得分:0)
您可能已将"regedit /s /i MyRegFile.reg"
作为可执行文件名传递。通过"regedit.exe"
和参数"/s /i MyRegFile.reg"
。