2012-04-04 1 views
2

어셈블리에 일리노이 코드를 컴파일하려고합니다. ilasm.exe은 C# 응용 프로그램에서 호출해야합니다. 저는 ilasm.exeProcessStartInfo 인스턴스를 통해 불러냅니다. PE의 생성은 잘 작동하고 어셈블리는 작동합니다.IL에서 생성 된 IL 생성 Assembly, ilasm.exe에 C#이 필요하며 UAC가 필요합니까?

내 문제는 내 응용 프로그램에서 만든 파일로 나중에 관리자 권한을 실행해야한다는 것입니다.

명령 줄에서 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. 
} 

내가 잘못 아무것도 건가요 다음 Ilasm.exe를 호출 ilasm.exe /qui /output="c:\test\newFile.exe" <path to il file>

내 응용 프로그램 :

는 Ilasm.exe를 명령을 사용? C#에서 다른 프로세스를 호출 할 때 다른 것을 지정해야합니까?

관리자 권한없이 내 응용 프로그램과 명령 줄을 실행하고 있습니다.

+0

비 관리자로받은 오류는 무엇입니까? patchFile이란 무엇입니까? 명령 행에서 호출 한 것과 똑같이 호출하지는 않습니다. –

+0

죄송합니다. 몇 가지 사항은 언급하지 않았습니다. patchFile은이 경우 il 코드가 들어있는 파일의 경로입니다. 나는 어떤 오류도 내지 않고있다. 오류는 ilasm.exe가 C# 코드를 통해 호출하고 이후에는 실행 권한이 필요하며 cmd를 통해 ilasm.exe 호출은 필요하지 않습니다. –

+0

당신이 이해한다면, 당신은 양쪽 모두가 유효한 EXE를 생성한다고 말하고 있지만,'Process.Start'에서 생성 된 것이 당신의 컴퓨터를 * BOOP *로 만들고 UAC 프롬프트를 띄웁니다.그렇다면 코드에서 나온 것이 highestAvailable'requestedExecutionLevel'을 임베딩 한 것처럼 들리네요. [here] (http://msdn.microsoft.com/en-us/library/bb756929.aspx). 그렇다면 왜 다른가라는 단서가 없습니다. –

답변

4

output의 쓰기 가능 위치에 대한 경로를 제공하지 않으므로 UAC가 필요합니다. 따라서 ilasm이 (또는 현재 앱의 현재 폴더에) 같은 폴더에 쓰려고합니다.

관리자가 아닌 사용자는 %WINDIR% (Windows 폴더) 또는 %ProgramFiles%에 대한 쓰기 권한이 없으므로 폴더에 대한 쓰기 권한이있는 사용자에게 권한 상승을 요청합니다.

+0

예 죄송합니다. 나는 변수를 선언하는 것을 잊었다. C#에서 생성 된 완전한 호출은'ilasm.exe C : \ Test \ myilcode.il/qui/output = C : \ Test \ testFile.exe'입니다. 내 응용 프로그램에서 호출 한 정확한 호출 된 명령은 나중에 관리자 권한이 필요하지만 cmd에서 manualy라는 명령은 그렇지 않습니다. 그래서 실제로 시스템 폴더에 쓰지 않을 겁니다. ( –

+2

OK. 원래의 질문에 답을하고 나중에 누군가에게 유용 할 수 있기 때문에 지금 당장 대답을 남겨 둘 것입니다. (나중에 참조 할 수 있도록, 문제가 생기면 관련 정보를 모두 제공하면 답을 얻는 데 도움이됩니다. :) 답변을 게시하기 전에 사람들이 모든 사실을 가지고 있음을 의미합니다. 즉, 나중에 정보를 추가 할 때 삭제해야 할 가능성이 적습니다. 대답을 무효화하십시오.) –

+0

'관련된 모든 정보'와 관련이 있습니다. 내 대답에 울부 짖음이 올 것입니다. –

1

patchFile이란 무엇입니까?

@Chris가 작성한이 의견은이 퍼즐과 관련이 있으며 질문에 표시되지 않습니다. UAC로 해결해야하는 어려운 문제를 다루고있을 것입니다. UAC 권한이 필요한 오래된 프로그램을 지원하지만 Vista 이전에 작성 되었기 때문에 요청하지 않습니다. 설치자처럼. 그리고 패치 프로그램.

내 수정 구슬은 귀하의 실제 프로그램 이름이 newFile.exe가 아니라 귀하의 질문에 "update.exe"또는 "patch.exe"와 같은 이름이 있다고 말합니다. 또한 생성 된 프로그램에 매니페스트를 포함시키지 않는 것이 분명하지 않습니다. 프로그램이 <requestedExecutionLevel> 엘리먼트를 가진 Vista인지를 나타내는 명단. 또한, 명령 줄에서 손으로 이것을 실행할 때 .exe에 다른 이름을 사용한다는 것도 분명하지 않습니다.

많은 추측이 있지만 그 두 가지를 조합하면 이해할 수 있습니다. Windows는 "aha! 오래된 프로그램은 제한된 디렉토리의 .exe 파일에 쓰기를 원하는 것처럼 들립니다."UAC 프롬프트를 더 잘 표시합니다. ".

+0

아, 좋은 캐치! 나는'update','setup' 및'install' 파일 이름 문제를 잊어 버렸습니다! +1, 왜냐하면 당신은 아마이 "심령"응답으로 돈을 100 %가되기 때문입니다. (나는 정말로 사람들이 실제 코드와 var 내용을 게시하여 과소 보호하려는 의미없는 것을 소설 화하는 대신 절대적인 minumum 만 익명으로 처리하기를 바란다. 이렇게 생각하면 훨씬 쉽게 잡을 수 있다고 생각한다.) –

관련 문제