3

我正在尝试将 IL 代码编译为程序集。ilasm.exe应该由我的 C# 应用程序调用。我正在ilasm.exe通过ProcessStartInfo实例调用。PE的生成工作正常,我的Assembly正在工作。

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

如果我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# 调用另一个进程时是否需要指定其他任何内容?

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

4

2 回答 2

4

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

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

于 2012-04-04T00:27:46.887 回答
1

什么是补丁文件?

@Chris 的评论与这个谜题有关,我在问题中看不到它。您可能正在处理 Microsoft 需要使用 UAC 解决的难题。支持需要 UAC 权限但不需要 UAC 权限的旧程序,因为它们是在 Vista 之前编写的。像安装程序。和补丁程序。

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

这是很多猜测,但将它们放在一起就很有意义:Windows 运行“啊哈!旧程序,听起来它想要写入受限目录中的 .exe 文件。更好地显示 UAC 提示符”。

于 2012-04-04T04:43:39.013 回答