Process.Start()和手动运行有什么区别?

时间:2013-09-08 08:12:18

标签: c# windows process.start regedit

我正在为我工​​作的公司创建一个应用程序,该应用程序将备份我们提供的某些软件的数据。它具有将SQL数据库,文件夹,文件和注册表项添加到备份作业的选项,然后将其放入Zip文件中。还可以选择在需要时还原备份。

我遇到了注册表备份和还原问题。我已经经历了许多迭代尝试让它工作,但我已经以最能说明我的问题的方式对其进行了简化,希望有人可以提供帮助。

基本上我通过使用带命令行参数的regedit.exe导入“.reg”文件。我试过通过使用ProcessStartInfo()构建它,但它没有用。因此,为了测试问题,我正在创建一个批处理文件,并按如下方式运行它:

    File.WriteAllText("ImportReg.bat", "regedit /s /i MyRegFile.reg");
    Process.Start("ImportReg.bat");

然而,这不起作用。

批处理文件已成功创建且REG文件有效。这两个文件都与EXE位于同一个位置,所以我认为问题不在于使用哪个目录。如果我自己从这个位置运行批处理文件,它会成功导入注册表文件。我是我正在测试它的机器上的完整管理员。

我也有从注册表导出的问题。注册表的某些部分导出正常,而其他部分则没有。但是,如果我将导出设置为像上面导入的批处理文件那么它每次都有效。

任何人都可以帮忙吗?我看不出为什么我的批处理文件有效,但是当它通过Process.Start运行时却看不到。任何建议都会受到大力赞赏。

3 个答案:

答案 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开发环境中设置此链接器选项

  1. 打开项目的“属性页”对话框。有关详细信息,请参见如何:打开项目属性页。
  2. 展开“配置属性”节点。
  3. 展开链接器节点。
  4. 选择清单文件属性页。
  5. 修改启用用户帐户控制(UAC),UAC执行级别和UAC绕过UI保护属性。
  6. 清单文件看起来像这样

    <?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"