patch.exe
はソースコードに差分を適用する UNIX 由来のコマンドです。この patch.exe
は Windows にも移植されているのですが、 ユーザーアカウント制御 (UAC) が有効になっている環境で patch.exe
を実行すると権限昇格ダイアログが表示されてしまうことがあります。
patch.exe
のアイコンに表示されている盾マークは、 ユーザーアカウント制御 (UAC) の対象プログラムであることを示しています。
patch.exe
を実行すると、 以下のダイアログが表示されてしまいます。
次の不明な発行元からのプログラムにこのコンピューターへの変更を許可しますか?
ダウンロード
説明はいいから、 ユーザーアカウント制御 (UAC) の権限昇格ダイアログが表示されない patch.exe
が欲しいという方は以下のリンクから patch.exe
をダウンロードしてお使いください。
権限昇格のダイアログが表示される原因
ユーザーアカウント制御 (UAC) については、 UAC のアーキテクチャに詳しく書かれています。
その UAC の機能の 1 つにインストーラー検出テクノロジーというものがあります。これはインストーラーと推測されるプログラムに対して自動的に UAC を適用する機能です。patch.exe
は patch
というインストーラーっぽいキーワードを含んでいるためにインストーラー検出テクノロジーによる UAC が発動してしまうのです。
インストーラー検出テクノロジーによる検出対象は次の項目に限られています。(次の 3 つの条件をすべて満たす場合に対象となります。)
- 32 ビットの実行ファイルである
- 要求レベルの属性を持たないアプリケーションである
- UAC を有効にして標準ユーザーとして実行される会話型プロセスである
32 ビットプロセスを作成する前に、 次の属性を調べて、 インストーラーであるかどうかを判断します。(次のいずれかの条件を満たす場合に対象となります。)
- ファイル名に、 “install”、 “setup”、 “update” などのキーワードが含まれている。
- “バージョン リソース” フィールドに、 “ベンダー”、 “会社名”、 “製品名”、 “ファイルの説明”、 “元のファイル名”、 “内部名”、 および “エクスポート操作の名前” のいずれかのキーワードが含まれている。
- サイド バイ サイド マニフェスト内のキーワードが実行可能ファイルに埋め込まれている。
- 特定の StringTable エントリ内のキーワードが実行可能ファイルにリンクされている。
- リソース スクリプト データの主要な属性が実行可能ファイルにリンクされている。
- 実行可能ファイル内に、 対象となるバイトのシーケンスが存在する。
patch.exe
をリネームして別の名前にすれば UAC の誤発動を回避することはできるのですが、 そんなことはしたくないですよね。
今回は、 要求レベルの属性を持たないアプリケーション
という条件を崩すことで UAC の誤発動を回避しようと思います。すなわち、 patch.exe
を 要求レベルの属性を持つアプリケーション
にすれば、 UAC は発動しなくなるわけです。
マニフェストを記述する
マニフェストは、 XML ドキュメントです。これは、 外部 XML ファイルにすることも、 アプリケーションにリソースとして埋め込むこともできます。マニフェストを記述することで、 アプリケーションに様々な属性や振る舞いを指定するこができます。
前述の 要求レベルの属性
とは requestedExecuteionLevel
のことです。これを指定するマニフェストは以下のようになります。
patch.exe.manifest<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
name="patch.exe"
version="2.5.9.2670"
processorArchitecture="X86"
type="win32"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
この XML を patch.exe.manifest
という名前で保存し、 patch.exe
と同じフォルダに配置します。これで、 ユーザーアカウント制御 (UAC) による権限昇格ダイアログは表示されなくなります。
マニフェストを実行ファイルに埋め込む
マニフェストを実行ファイルに埋め込むこともできます。patch.exe.manifest
を patch.exe
に埋め込んでファイルを 1 つにまとめてしまったほうが扱いやすいですよね。
mt.exe
というツールを使用すると、 マニフェストを実行ファイルに埋め込むことができます。mt.exe
は、 Visual Studio や Windows SDK に含まれています。mt.exe
を使用してマニフェストを埋め込む方法は、 「マニフェストを C/C++ アプリケーションに埋め込む」 で解説されています。
具体的には以下のコマンドで埋め込みができます。
コマンドプロンプトC:¥>mt.exe -manifest patch.exe.manifest -outputresource:patch.exe;1
mt.exe
が見つかりませんか? 普通にコマンドプロンプトを起動しただけでは、 PATH が設定されていないために mt.exe
を実行することができないかもしれません。そんなときは、 スタートメニューから Visual Studio の 「開発者コマンドプロンプト」 を探して起動してみてください。開発ツールに PATH が通った状態のコマンドプロンプトが開きます。
マニフェストを埋め込んで、 インストーラー検出テクノロジーに誤判定されないようにした patch.exe
はアイコンに盾マークが表示されなくなります。
自分でマニフェストを埋め込むのが面倒という方は、 マニフェストを埋め込んで UAC 対応にした patch.exe
をダウンロードしてお使いください。
マニフェスト埋め込み前のオリジナルの patch.exe
は以下のサイトからダウンロードすることができます。
patchコマンドの実行時にエラーが出てしまうときは?
patch コマンドでパッチを適用しようとしたときに、 以下のエラーが出ることがあるかもしれません。
Assertion fafiled: hunk, file ../patch-2.5.9-src/patch.c, line 354
This application has requested the Runtime to terminate it in an unusual way. Please contact the application’s support team for more information.
これはパッチファイルの改行コードが LF
だけの場合に発生することがあります。パッチファイルの改行コードを CR+LF
に変更して、 正しく動作するか試してみてください。