0

I'm creating a Process in my application which executes the cmd.exe with the following argument:

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

The application itself runs without exceptions but with an error when I display the output of Process.StandardError.ReadToEnd(): "ERROR: Access denied".

I already tried creating an app.manifest file and changing the requestedExecutionLevel to requireAdministrator - but I still get the same error.

When I execute the command in a shell that is run as administrator the .reg-File is created at the specified path.

So, is there anything else I need to specify in order to elevate the process? And what about UAC? It is disabled as soon as I run my application as an administrator, right?

I'm using Visual Studio 2017 Enterprise and the target framework is NETCore app 1.1.

EDIT: Here's my code:

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);

I ran this code with the following app.manifest file:

<?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>
Pete Hilde
  • 659
  • 1
  • 10
  • 24
  • _" If you consider marking this question as a duplicate please make sure not to post a question with an answer that describes the same procedure I already tried"_ -- we have no way to actually _know_ what procedure you already tried, because your question doesn't include any good [mcve] _showing_ what you've tried. – Peter Duniho Jul 27 '17 at 07:27
  • If you are able to include the admin username and password in your program, you may also be able to use `ProcessStartInfo.Password` and `ProcessStartInfo.UserName` to elevate without the UAC prompt. – Peter Duniho Jul 27 '17 at 07:35
  • My IDE does not find an attribute called "Password" in class ProcessStartInfo. But that doen't matter - I easily fixed it by setting the uiAccess to true what causes the application to elevate without he UAC prompt. – Pete Hilde Jul 27 '17 at 11:36

0 Answers0