2012-04-04 14 views
2

私はILコードをアセンブリにコンパイルしようとしています。 ilasm.exeは私のC#アプリケーションによって呼び出されるはずです。私はilasm.exeProcessStartInfoインスタンスで呼び出しています。 PEの世代はうまく動作し、私のアセンブリは機能しています。私のIL生成アセンブリ、C#で呼び出されるilasm.exeにUACが必要なのはなぜですか?

私の問題は、自分のアプリケーションで作成されたファイルで、その後に管理者権限を実行する必要があることです。

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. 
} 

私が間違って何をやっているか?ilasm.exeコマンドを使用し

C#から別のプロセスを呼び出す際に何かを指定する必要はありますか?

私は管理者権限のないアプリケーションとコマンドラインを実行しています。

+0

管理者以外のエラーは何ですか? patchFileとは何ですか?コマンドラインからの呼び出しと同じように呼び出すわけではありません。 –

+0

申し訳ありませんいくつかのことを言いました。 patchFileはこの場合、ilコードを含むファイルへのパスです。私は何の誤りもありません。エラーは、ilasm.exeがc#コードを呼び出し、その後は実行するための管理者権限が必要ですが、cmdを使用してilasm.exeを呼び出す場合は、それらを必要としません。 –

+0

私はあなたが理解していれば、どちらも有効なEXEを生成していると言っていますが、 'Process.Start'から生成されたものはコンピュータを* BOOP *にしてUACプロンプトをポップします。その場合、コードからのものが、「highestAvailable」 'requestedExecutionLevel'を埋め込んでいるように聞こえます[ここ](http://msdn.microsoft.com/en-us/library/bb756929.aspx)。もしそうなら、なぜそれが違うのか分からない。 –

答えて

4

あなたはoutputで書き込み可能な場所へのパスを供給していないので、同じフォルダilasmに書き込みをしようとしていることに(またはアプリの現在のフォルダ)であるので、それはUACを必要としています。

管理者以外のユーザーは、%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によるこのコメントはこのパズルに関連していますが、質問には表示されません。おそらく、MicrosoftがUACで解決する必要のある困難な問題に取り組んでいるでしょう。 UAC特権を必要とする古いプログラムをサポートしていますが、Vista以前に書かれているため、要求しません。インストーラのように。パッチプログラム。

私のクリスタルボールはあなたの実際のプログラム名がnewFile.exeではないとあなたの質問が言うように、しかし "update.exe"や "patch.exe"のような名前を持っていると言います。さらに、生成したプログラムにマニフェストを含めないことも明らかではありません。このプログラムは、<requestedExecutionLevel>要素でVistaが認識しているというマニフェストです。さらに、コマンドラインから手動でこれを実行すると、.exeの別名を使用することも明らかではありません。

これはかなり推測ですが、それらをまとめると意味があります:Windowsは "aha!古いプログラムです。制限付きディレクトリに.exeファイルを書きたいと思うように聞こえます。 "

+0

ああ、いいキャッチ! 'update'、' setup'、 'install'ファイル名の問題を忘れてしまいました! +1、あなたはおそらくこの "精神的な"答えでお金の100%です。 (私は本当に人々が実際のコードとvarの内容を投稿し、無意味なものを架空のものにするのではなく絶対的なminumumのみを匿名化したいと思っています。 –

関連する問題