2012-04-04 20 views
2

我正在嘗試將IL代碼編譯到程序集。 ilasm.exe應該被我的C#應用​​程序調用。我通過ProcessStartInfo實例調用ilasm.exe。體育課的生成正常,我的大會正在開展工作。爲什麼我的IL生成的Assembly,由C#調用的ilasm.exe需要UAC?

我的問題是,由我的應用程序創建的文件,以後需要管理員權限才能執行。

如果我通過命令行手動調用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#調用另一個進程時是否需要指定其他內容?

我正在運行我的應用程序和沒有管理員權限的命令行。

+0

作爲非管理員收到的錯誤是什麼?什麼是patchFile?你不會像你說的那樣從命令行調用它。 – 2012-04-04 00:24:28

+0

對不起,我忘了提及一些事情。在這種情況下,patchFile是包含il代碼的文件的路徑。我沒有收到任何錯誤。錯誤在於ilasm.exe通過c#代碼調用,之後需要管理員權限才能執行,而ilasm.exe通過cmd調用並不需要它們。 – 2012-04-04 00:36:13

+0

如果我理解你,你說的都是生成有效的EXE,但是從'Process.Start'生成的EXE會讓你的計算機去* BOOP *並彈出UAC提示符。如果是這樣的話,聽起來就像代碼中嵌入了'highestAvailable'' requestedExecutionLevel'解釋[here](http://msdn.microsoft.com/en-us/library/bb756929.aspx)。如果是這樣,我不知道爲什麼它會不同。 – 2012-04-04 00:40:49

回答

4

它需要UAC,因爲您沒有提供路徑到output中的可寫位置,所以它試圖寫入同一文件夾ilasm位於(或當前應用程序的文件夾中)。

非管理員用戶沒有對%WINDIR%(Windows文件夾)或%ProgramFiles%下的任何內容的寫入權限,因此它要求提升給具有對該文件夾的寫入權限的用戶。

+0

是的,我很抱歉。我忘了宣佈我的變數。從C#生成的完整調用將是'ilasm.exe C:\ Test \ myilcode.il/qui/output = C:\ Test \ testFile.exe'。之後,我的應用程序調用的確切的調用命令需要管理員權限,而從cmd調用manualy的則不需要。所以實際上我並沒有寫信給系統文件夾:( – 2012-04-04 00:40:34

+2

好了,我現在就回答我的問題,因爲它確實解決了原問題,並且可能對未來某個人有用(並且爲了將來的參考,當你遇到問題時,如果你提供了所有相關信息,它可以幫助你得到答案。:)這意味着人們在發佈答案之前擁有了所有的事實,這意味着當你添加細節時,他們不太可能必須刪除它。無效的答案。) – 2012-04-04 00:47:33

+0

'所有相關的信息'是相關的,你會有我的回答嚎叫:) – 2012-04-04 04:46:22

1

什麼是patchFile?

@Chris的評論與這個謎題有關,我沒有看到它的問題。你可能正在處理一個微軟需要用UAC解決的難題。支持需要UAC權限的舊程序,但不要求它,因爲它們是在Vista之前編寫的。像安裝程序一樣。和補丁程序。

我的水晶球說你的實際程序名不是newFile.exe,就像你的問題所說的,但有一個像「update.exe」或「patch.exe」這樣的名字。此外,也不是很明顯,您沒有在您生成的程序中包含清單。一個清單說,該程序是Vista認識到<requestedExecutionLevel>元素。此外,也不是很明顯,當您從命令行手動運行此命令時,您使用另一個名稱作爲.exe。

這是很多猜測,但把它們放在一起,它是有道理的:Windows去「aha!舊程序,聽起來像它將要寫入到受限目錄中的.exe文件。更好地顯示UAC提示」。

+0

啊,很好!我忘記了'update','setup'和'install'文件名的問題! +1,因爲你用這個「精神」答案可能是100%的錢。 (我真的希望人們會發布實際的代碼和var內容,匿名化只是絕對的最小值,而不是虛構化無意義的東西過度保護。我認爲這會讓事情變得容易得多。) – 2012-04-04 10:57:27

相關問題