Search code examples
c#.netuaccililasm

Why does my IL generated Assembly, ilasm.exe called by C#, need UAC?


I'm trying to compile an IL Code to an Assembly. The ilasm.exe should get called by my C# Application. I'm invoking the ilasm.exe through an ProcessStartInfo Instance. The generation of the PE works fine and my Assembly is working.

My problem is that the files that were created by my application, afterwards need administrator privileges to be executed.

If I call ilasm.exe manually from command line, no admin rights are needed.

Used ilasm.exe command: ilasm.exe /qui /output="c:\test\newFile.exe" <path to il file>

My Application calling the ilasm.exe:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = ilFilePath + " /qui /output=" + outputPath + "testFile.exe";


try
{
    using (Process exeProcess = Process.Start(startInfo))
    {
        exeProcess.WaitForExit();
    }
}
catch
{
    // Log error.
}

Am I doing anything wrong? Do I need to specify anything else when calling another Process from C#?

I'm running my Application and the commandline without admin rights.


Solution

  • It's requiring UAC because you're not supplying a path to a writable location in output, so it's trying to write to the same folder ilasm is in (or the current folder for your app).

    A non-admin user doesn't have write access to anything under %WINDIR% (the Windows folder) or %ProgramFiles%, so it's asking for elevation to a user that does have write access to the folder.