如何使用提升的权限运行System.Diagnostics.Process?

时间:2017-07-27 07:20:19

标签: c# process command registry elevation

我正在我的应用程序中创建一个Process,它使用以下参数执行cmd.exe:

REG EXPORT "HKU\S-1-5-21-2198249526-820760291-2548842010-1000\Keyboard Layout\Preload" D:\Backups\Preload.reg

应用程序本身运行时没有异常但在显示Process.StandardError.ReadToEnd()的输出时出错:“错误:访问被拒绝”。

我已经尝试创建app.manifest文件并将requestedExecutionLevel更改为requireAdministrator - 但我仍然遇到同样的错误。

当我在以管理员身份运行的shell中执行命令时,会在指定路径创建.reg-File。

那么,为了提升流程,还有什么我需要指定的吗? 那UAC呢?一旦我以管理员身份运行我的应用程序,它就会被禁用,对吗?

我正在使用Visual Studio 2017 Enterprise,目标框架是NETCore app 1.1。

编辑:这是我的代码:

Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();         
startInfo.FileName = "cmd.exe";

startInfo.CreateNoWindow = true;
startInfo.Arguments = "REG EXPORT \"HKU\S-1-5-21-2198249526-820760291-2548842010-1000\Keyboard Layout\Preload\" D:\Backups\Preload.reg";
startInfo.WorkingDirectory = "D:\\Backups";

process.StartInfo = startInfo;
process.StartInfo.RedirectStandardError = true;
process.Start();
process.WaitForExit();
string error = process.StandardError.ReadToEnd();
Console.Write(error);

我使用以下app.manifest文件运行此代码:

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC Manifest Options
             If you want to change the Windows User Account Control level replace the 
             requestedExecutionLevel node with one of the following.

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            Specifying requestedExecutionLevel element will disable file and registry virtualization. 
            Remove this element if your application requires this virtualization for backwards
            compatibility.
        -->
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>

  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- A list of the Windows versions that this application has been tested on and is
           is designed to work with. Uncomment the appropriate elements and Windows will 
           automatically selected the most compatible environment. -->

      <!-- Windows Vista -->
      <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->

      <!-- Windows 7 -->
      <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->

      <!-- Windows 8 -->
      <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->

      <!-- Windows 8.1 -->
      <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->

      <!-- Windows 10 -->
      <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->

    </application>
  </compatibility>

  <!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
       DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need 
       to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should 
       also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->
  <!--
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
  </application>
  -->

  <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
  <!--
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="*"
          publicKeyToken="6595b64144ccf1df"
          language="*"
        />
    </dependentAssembly>
  </dependency>
  -->

</assembly>

0 个答案:

没有答案