为什么我的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#调用另一个进程时,我需要指定其他内容吗?
我在没有管理员权限的情况下运行我的应用程序和命令行。
它需要UAC,因为您没有提供指向output
中可写位置的路径,所以它试图写入ilasm
所在的同一文件夹(或应用程序的当前文件夹)。
非管理员用户对%WINDIR%
(Windows文件夹)或%ProgramFiles%
下的任何内容都没有写访问权限,因此它要求提升到对该文件夹有写访问权限的用户。
什么是patchFile?
@Chris的这条评论与这个谜题有关,我不认为这是问题。你可能正在处理一个微软需要用UAC解决的难题。支持需要UAC权限的旧程序,但不要要求它,因为它们是在Vista之前编写的。就像安装程序一样。以及补丁程序。
我的水晶球说,你的实际程序名并不像你的问题所说的那样是newFile.exe,而是有一个像"update.exe"或"patch.exe"这样的名称。此外,也不明显,你生成的程序中没有包含清单。一个清单,表明该程序是具有<requestedExecutionLevel>
元素的Vista感知程序。此外,同样不明显的是,当你从命令行手动运行时,你会为.exe.使用另一个名称
这是很多猜测,但把它们放在一起,这是有道理的:Windows会说"啊哈!旧程序,听起来像是要写入受限目录中的.exe文件。最好显示UAC提示"。