patch.exe ユーザーアカウント制御(UAC)対応版

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 に変更して 正しく動作するか試してみてください。

この記事を共有しませんか?