2017-06-11 13 views
-2

私は2つの実行可能ファイルを持っていますが、最初のファイルは2番目のファイルを実行する必要があります。 2つめのファイルには、asInvokerrequireAdministratorなど
実行可能ファイルのマニフェストを変更することはできますか?私はCの簡単な解決策を探しています。
異なるタイプのマニフェストで実行可能なコピーをほとんど保持しないようにしたいですし、サードパーティのツールを変更する可能性があります。ところで、それは可能であり、このツールが存在します:MT(マニフェストツール)ビジュアルスタジオパッケージから、link実行ファイルでマニフェストを変更するにはどうすればよいですか?

+1

マニフェスト - このあるリソース(exeファイルの*のためのタイプ= 'RT_MANIFEST'、名前=' CREATEPROCESS_MANIFEST_RESOURCE_ID'(*) - あなたが使用することができます[ 'UpdateResource'](https://msdn.microsoft.com/en-私たち/ライブラリ/ windows/desktop/ms648049(v = vs.85).aspx)の代わりに、もちろんexeが署名されていない場合 – RbMm

+0

私のexeは署名されていない、私はこの機能をチェックします。 – Jury

+1

署名はこれとは何の関係もなく、RbMmが提案した手法を実際のコードで使用すべきではありません。彼は文字通り 'mt.exe 'それは(悪い設計や誤解の証拠です)(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)です。 –

答えて

3

はい、Win32 SDKからmt.exeを使用してマニフェストファイルを変更できます。しかし、それは開発やテスト中に行うべきことです。このツールを顧客のマシンに展開することはできないため、このツールを使用してマニフェストを前後に動的に変更することはできません。

しかし、これは実行時にマニフェストファイルを前後に変更する必要がないためです。実行可能ファイルのマニフェストファイルには、そのEXEに対しての最小必要特権を指定する必要があります。したがって、ユーザーが管理特権なしで(つまり高度なしで)EXEを実行することができれば(アプリが限定された機能で実行されていることを意味していても)、アプリのマニフェストで「asInvoker」を指定する必要があります。追加機能が必要な場合は、管理者権限でいつでもアプリを実行することができます。

もちろん、高度でプログラムでEXEを起動することもできます。 lpVerbパラメータの "runas"動詞を指定してShellExecuteExを使用してこれを行います。これは、アプリケーションマニフェストの権限レベルを "requireAdministrator"に設定するのと同じ効果を持ちます。

あなたのアプリケーションがどのように設定されているかは、あなたの質問から完全にはっきりしません。通常、最初のEXEにはマニフェストに "asInvoker"が設定されているので、どのユーザーでも実行できます。何かをするために管理者権限は必要ありません。ただし、の場合は、管理者権限が必要な操作が必要な場合があります.UACシールドアイコンでUIの一部を表示し、それをクリックすると、マニフェストに「requireAdministrator」が設定された2番目のEXEが起動します。仰角を必要とするタスクを実行します。この2番目のアプリは、 "asInvoker"フォームで配布する必要はありません。常にには標高が必要です。これは、オペレーティングシステムに同梱されているビットを含め、Microsoftのすべてのアプリケーションがどのように設定されているかに気づくでしょう。

-1

ありがとう@RbMm for his comment
また、私の質問はduplicateです。申し訳ありませんが、私はこれ以前にこれを発見していません。

ので、溶液(エラー処理や省略が含まれる):さらなる世代のための

HANDLE handle = BeginUpdateResourceW(file, TRUE); 
UpdateResourceW(handle, RT_MANIFEST, CREATEPROCESS_MANIFEST_RESOURCE_ID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), manifest, strlen(manifest)); 
EndUpdateResourceW(handle, FALSE); 

注:

  • マニフェストはshort charsにする必要があります - char *代わりのwchar *
  • エラー(たとえば、不正なXML構文)は、Event ViewerのセクションWindows Logs -> Application
  • 一部のツール(Resource Hacker)が開いてマニフェストを表示することもできますが、エラーもなくユニコードマニフェストが表示されます...
関連する問題