为什么我的IL生成的程序集,C#调用的ilasm.exe,需要UAC

本文关键字:ilasm 调用 exe UAC 需要 程序集 我的 IL 为什么 | 更新日期: 2023-09-27 18:29:51

我正在尝试将IL代码编译为程序集。ilasm.exe应该由我的C#应用程序调用。我正在通过一个ProcessStartInfo实例调用ilasm.exe。PE的这一代运作良好,我的大会正在运作。

我的问题是,我的应用程序创建的文件之后需要管理员权限才能执行。

如果我从命令行手动调用ilasm.exe,则不需要管理员权限。

已使用ilasm.exe命令:ilasm.exe /qui /output="c:'test'newFile.exe" <path to il file>

我的应用程序调用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.
}

我做错什么了吗?当从C#调用另一个进程时,我需要指定其他内容吗?

我在没有管理员权限的情况下运行我的应用程序和命令行。

为什么我的IL生成的程序集,C#调用的ilasm.exe,需要UAC

它需要UAC,因为您没有提供指向output中可写位置的路径,所以它试图写入ilasm所在的同一文件夹(或应用程序的当前文件夹)。

非管理员用户对%WINDIR%(Windows文件夹)或%ProgramFiles%下的任何内容都没有写访问权限,因此它要求提升到对该文件夹有写访问权限的用户。

什么是patchFile?

@Chris的这条评论与这个谜题有关,我不认为这是问题。你可能正在处理一个微软需要用UAC解决的难题。支持需要UAC权限的旧程序,但不要要求它,因为它们是在Vista之前编写的。就像安装程序一样。以及补丁程序。

我的水晶球说,你的实际程序名并不像你的问题所说的那样是newFile.exe,而是有一个像"update.exe"或"patch.exe"这样的名称。此外,也不明显,你生成的程序中没有包含清单。一个清单,表明该程序是具有<requestedExecutionLevel>元素的Vista感知程序。此外,同样不明显的是,当你从命令行手动运行时,你会为.exe.使用另一个名称

这是很多猜测,但把它们放在一起,这是有道理的:Windows会说"啊哈!旧程序,听起来像是要写入受限目录中的.exe文件。最好显示UAC提示"。