[英]Why does my IL generated Assembly, ilasm.exe called by C#, need UAC?
我正在嘗試將 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%
下的任何內容都沒有寫入權限,因此它要求提升到對該文件夾具有寫入權限的用戶。
什么是補丁文件?
@Chris 的評論與這個謎題相關,我在問題中看不到它。 您可能正在處理 Microsoft 需要使用 UAC 解決的難題。 支持需要 UAC 權限但不要求的舊程序,因為它們是在 Vista 之前編寫的。 像安裝人員。 和補丁程序。
我的水晶球說你的實際程序名稱不像你的問題所說的那樣是 newFile.exe,而是有一個像“update.exe”或“patch.exe”這樣的名稱。 此外,您沒有在生成的程序中包含清單也不是很明顯。 一份清單,表明該程序具有<requestedExecutionLevel>
元素的 Vista 感知能力。 此外,同樣不明顯的是,當您從命令行手動運行它時,您為 .exe 使用了另一個名稱。
這是很多猜測,但將它們放在一起是有道理的:Windows 是“啊哈,舊程序。聽起來它想要寫入受限目錄中的 .exe 文件。最好顯示 UAC 提示”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.