Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2016年04月12日] [更新 2016年10月10日] Delphi 一般・その他
   
EXE 起動時の [ 不明な発行元 ] ダイアログを非表示にする
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro
[整理番号 - 0440]



  • 2016年06月29日
  • [このファイルを開く前に常に警告する] と [ブロックの解除] は同じと記述していたが,他のファイルを操作する EXE では,他のファイルの設定も影響するので説明を修正した.




[ 開いているファイル - セキュリティの警告 ] ダイアログ


本ページのタイトルは [不明な発行元] となっていますが,これはコミュニティの場で質問者が使用している用語です.実際には,ウィンドウのキャプション (タイトル) が [開いているファイル - セキュリティの警告] という下図のダイアログのことです.



図1
セキュリティの警告のダイアログ
  • 発行元は [名前] あるいは [発信元] で判断する
  • 基本的には,自分自身がどこからか入手したはずである
  • 覚えのないファイルは開かないで削除した方が無難
  • [Shift] + [Del] で,ゴミ箱には入れないで削除できる

Windows 8 / 8.1 / 10 では下図の [Windows によって PC が保護されました] というタイトルのダイアログになっています.



図2
Windows 10 の場合

インターネットからダウンロードしたファイルには,ZoneID (ゾーン・アイディ) というセキュリティ情報が付加されています.この ZoneID は,インターネットからダウンロードしたかどうかの識別子です.このため,EXE ファイル等を起動する際に,上の図のダイアログが表示されます.



[備考 1]
管理者への昇格を促す [ユーザーアカウント制御] ダイアログ,[Windows セキュリティの重要な警告] ダイアログでも,デジタル署名がない場合は発行元が不明と表示されます.
アプリケーションの開発者が,動作可能な Windows のバージョン情報を EXE に組み込んでいない場合に現れる以下の記事のダイアログでも発行元が不明となります.

[備考 2]
デジタル署名 (コードサイニング証明書) は,プログラムやファイル等の発行元 (作成者) の身分証明書のようなものです.デジタル署名には有効期限があります.取得費用は年間 6 ~ 9 万円程度です (2016年時点).
当サイトのような個人サイトの多くはデジタル署名 (コードサイニング証明書) を取得していません.そのため,警告関係のダイアログの発行元が不明となります.
当サイトからダウンロードしたファイルについては,当サイトの管理人である Mr.XRAY を信じて頂くしかありません.




01_ブロック解除でセキュリティの警告ダイアログを非表示に


下図のように,該当ファイルの [プロパティ] ダイアログを表示して,[ブロックの解除] ボタンをクリックしてブロックを解除すれば,それ以降,上の図のダイアログは現れなくなります.
下図の [プロパティ] のダイアログは,エクスプローラの該当ファイル上で,マウスの右ボタンをクリックして,メニューから [プロパティ] を選択すると表示できます.

ブロックの解除は,EXE ファイルだけでなく,その EXE に関係するファイルを全て [ブロックの解除] をしないと,アプリケーションが正常に動作しない場合があります.
インターネットからダウンロードしたファイルは,多くの場合,圧縮して 1 つのファイルになっています.この圧縮ファイルのブロックを解除してから解凍展開します.そうすれば,圧縮ファイルに格納されているファイルのブロックも解除されます.

インストーラでインストールするアプリでは,多くの場合 [ブロックの解除] は必要ありません.インストールの際に自動的に解除されます.



[備考]
ファイルのショートカットのプロパティには [ブロックの解除] の項目はありませんが,元のファイルのブロックが解除されていないと,上の図のダイアログが現れます.


図3
上の図のダイアログを非表示にする方法
  • [ブロックの解除] ボタンをクリック
  • [OK] ボタンで閉じる

  • インターネットからダウンロードしたファイルは,このブロックの解除をしてから解凍展開した方がよい
  • [読み取り専用] にチェックがあると [ブロックの解除] ボタンはクリックできるが,実際には解除できない

一般的な解凍展開ツールには,解凍展開時に自動でブロックを解除する機能があります.
下図は筆者が使用しているツールですが,[解凍オプション] の [NTFS の ZoneID を維持して展開] のチェックを外しておくと,ブロックの解除の操作が不要となります.



図4
圧縮・解凍ツールの自動ブロック解除設定の例




02_[ このファイル開く前に常に警告する ] のチェックを外す方法


このダイアログを表示しないようにするには,[このファイルを開く前に常に警告する] のチェックを外す方法もあります.
ただし,対象の EXE ファイルだけでなく,関連するファイルも [ブロックの解除] を行わないと,プログラムが正常に動作しない場合があります.



[備考]
当サイトからダウンロードしたプロジェクトを,自分の環境でコンパイルして EXE を再作成すれば EXE 起動時にダイアログは現れなくなります.
ただし,この場合も EXE に関係するファイルも [ブロックの解除] をしないとプログラムが正常に動作しない場合があります.


図5
[このファイル開く前に常に警告する] のチェックを外す




03_[ Windows によって PC が保護されました ] ダイアログ


Windows 8 / 8.1 / 10 では下図のようなダイアログが現れます.
このダイアログが現れたら [詳細情報] をクリックして,[実行] をクリックすると,ブロックが解除されて実行できます.ただし,EXE に関係するファイルも [ブロックの解除] をしないとプログラムが正常に動作しない場合があります.



図6
PC の保護
  • [詳細情報] をクリックして [実行] をクリックするとブロックが解除される




04_システム的に自動でブロックを解除する方法


インターネットからファイルをダウンロードすると,ZoneID という識別子が付きます.この ZoneID を,ダウンロードの時に自動で削除してブロックを解除してしまう方法です.

[ファイル名を指定して実行] のダイアログで次のコマンドを実行して,[ローカルグループポリシーエディタ] のダイアログを表示して設定します.後は図の説明に従ってください.


gpedit.msc


メールに添付されているファイルも,インターネットからダウンロードしたものです.
この設定を行うと,メールの添付ファイルからも ZoneID が削除されます.メールソフトの動作仕様や設定によっては,ウィルス付きファイルやマルウェア,スパイウェア等が直ちに実行されてしまう可能性も考えられます.確認が必要でしょう.



図7
gpedit.msc を起動
  • 左ペインの [Windows コンポーネント] を選択
  • 右ペインの [添付ファイルマネージャー] をダブルクリック
図8
ゾーンの設定
  • [ゾーン情報を削除する方法を非表示にする] をダブルクリック
図9
有効にして [OK]
  • デフォルトの値は [未構成]




05_ファイルのブロックを解除するサンプルコード
plDeleteBlock.zip [565 KB] 2016年10月11日版 (説明なし,ソースコードなし)
ファイルのブロック解除プログラム.再配布自由


Delphi のコードからブロックの解除を実行するサンプルです.
[ファイルの選択] ダイアログで選択したファイルのブロックを解除します.
このコードでは,読み取り専用属性のファイルのブロックは解除できません.また,ファイルの所有権がログインユーザ以外の場合や,システムフォルダ,Program Files 等のフォルダ内のファイルのブロックの解除はできません.



[備考 1]
当サイトに掲載している圧縮された書庫ファイルの解凍展開のサンプルは,ほとんどのサンプルで自動ブロック解除となっています.


[備考 2]
上の plDeleteBlock.zip に添付しているプログラムは,エクスプローラからのドラッグ & ドロップと,フォルダ単位,複数ファイルのブロック解除の機能を追加しています.読み取り専用属性のファイルのブロックも解除可能にしています.ただし,読み取り専用属性の変更はしません.
ダウンロードして解凍展開して実行し,自分自身を指定してブロック解除できます.




図10
ブロックの解除
  • ダウンロードした [003_StopWatch.zip] のブロックを解除
図11
plDeleteBlock.zip に添付のプログラム
  • エクスプローラからのドラッグ & ドロップの操作も可能
  • ショートカットを作成して,そのショートカットへのドロップ & ドロップでも動作可能

リスト1
ファイルのブロックを解除するサンプル
読み取り専用属性のファイルのブロック解除はできない
//=============================================================================
//  フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName);
end;

//=============================================================================
//  指定ファイルのZone.Identifierを削除
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LFileName : string;
  LText     : string;
begin
  OpenDialog1.OptionsEx  := [];
  OpenDialog1.FileName   := '';
  if not OpenDialog1.Execute then exit;

  OpenDialog1.InitialDir := ExtractFileDir(OpenDialog1.FileName);
  LabeledEdit1.Text := '';

  //選択したファイル名
  LFileName := OpenDialog1.FileName;
  LabeledEdit1.Text := LFileName;
  LabeledEdit1.SelStart := Length(LabeledEdit1.Text);


 if FileExists(LFileName + ':Zone.Identifier') then begin
   if not DeleteFile(LFileName + ':Zone.Identifier') then begin
     LText := 'ブロックの解除ができませんでした';
   end else begin
     LText := 'ブロックを解除しました';
   end;
   MessageBox(Handle, PChar(LText), '情報', MB_ICONINFORMATION);
 end else begin
   LText := 'このファイルには ZoneID がありません';
   MessageBox(Handle, PChar(LText), '情報', MB_ICONINFORMATION);
 end;
end;




06_ファイルに ZoneId を付加する - ファイルのブロック


上とは逆に,ファイルに ZoneId を付加してブロックを設定するサンプルです.
ZoneId には下表のような値があります.したがって,下のコードでは ZoneId として 3 という値を付加します.FileSystemObject オブジェクトを使用してファイルの操作をしています.

ブロックの解除と同じく,所有権のないファイルに対しては設定できません.Windows の圧縮属性のファイル,読み出し専用属性のファイル,システムフォルダ内のファイル,Program Files 内のファイルも設定できまません.Program Files 内のファイルは,管理者権限で実行すれば設定可能です.



0 マイコンピュータゾーン (解除と同じ)
1 イントラネットゾーン
2 信頼済みサイトゾーン
3 インターネットゾーン
4 制限付きサイトゾーン




リスト2
ファイルに ZoneId を付加する - ファイルのブロック
implementation

uses
  Scripting_TLB,
  ComObj;

{$R *.dfm}

//=============================================================================
//  フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName);
end;

//=============================================================================
//  指定ファイルのZone.Identifierを追加
//  FileSystemObjectオブジェクトを使用する例
//
//  usesにScripting_TLB,ComObjが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LFileSystem : IFileSystem3;
  LTextStream : ITextStream;
  LFileName   : string;
  LText       : string;
begin
  OpenDialog1.OptionsEx := [];
  OpenDialog1.FileName  := '';
  if not OpenDialog1.Execute then exit;

  OpenDialog1.InitialDir := ExtractFileDir(OpenDialog1.FileName);
  LabeledEdit1.Text := '';


  //FileSystemObjectオブジェクトを生成
  LFileSystem := CoFileSystemObject.Create;
  try
    //選択したファイル名
    LFileName := OpenDialog1.FileName;
    LabeledEdit1.Text := LFileName;
    LabeledEdit1.SelStart := Length(LabeledEdit1.Text);

    try
      //ファイルをテキストファイルとして開く
      //OpenTextFileの第3引数をTrueにしないと設定できない
      LTextStream := LFileSystem.OpenTextFile(LFileName + ':Zone.Identifier',
                                              ForWriting,
                                              True,
                                              TristateUseDefault);
      //Zoneidを追加する
      LTextStream.WriteLine('[ZoneTransfer]' + sLineBreak + 'ZoneId=3');
    except
      //ITextStreamの取得に失敗した場合
      LText := 'ブロックを設定できませんでした';
      MessageBox(Handle, PChar(LText), '結果', MB_ICONINFORMATION);
    end;
    if LTextStream <> nil then begin
      LTextStream.Close;
    end;
  finally
    LTextStream := nil;
    LFileSystem := nil;
  end;
end;




07_[ ユーザーアカウント制御 ] ダイアログ - 管理者権限での実行


非表示にする対象のダイアログではありませんが,EXE ファイル,つまりプログラムを起動した時に現れるダイアログには下図のような [ユーザーアカウント制御] ダイアログもあります.

ユーザーアカウント制御 (UAC) は Windows Vista で実装された機能です.このダイアログは,システム関係の設定の変更,システム関係フォルダ内のファイルの操作等,管理者権限が必要な場合に表示されます.管理者への昇格ダイアログとも言われています.

プログラムの作成者である発行元がデジタル署名 (コードサイニング証明書) を取得していない場合は,発行元が不明と表示されます.
UAC の機能を無効にすれば,このダイアログを表示しないようにできますが,ネットワーク関係の設定の一部ができなくなる場合があります.また,Windows のテンポラリファイル (一時ファイル) を使用するアプリで不具合が発生することがあります.
Windows 10 で UAC を無効にすると,ストアアプリ,Microsoft Edge や電卓等のビルトインアプリが使用できなくなり,個人設定の一部も設定できなくなります.
UAC を無効にすることと,管理者への昇格は同じではありません.

管理者権限での実行が必要なのにこのダイアログが現れない場合は,該当ファイル,あるいは該当ファイルのショートカットの上で,マウスの右ボタンクリックで表示されるメニューから [管理者として実行] を選択すれば,このダイアログを表示することができます.



図12
発行元がデジタル署名を取得していない場合
  • 発行元はプログラム名で判断する
  • このプログラムの発行元 (作成者) は筆者であるが,発行元は [不明] となる
  • [はい] で実行しても,ブロックが解除されるわけではない
図13
発行元がデジタル署名を取得している場合
  • 発行元は Microsoft
  • [はい] で実行しても,ブロックが解除されるわけではない
  • この図の Windows コマンドプロセッサは,元々 Windows にインストールされているプログラムなので [ブロックの解除] は不要

[備考 1]
Window Vista 以降に対応したアプリケーションは,必要な時にこのユーザーアカウント制御対アログ (管理者への昇格ダイアログ) が表示されるようになっています. 問題なのは,古いアプリケーション,ソフトを,Windows Vista 以降にインストールして利用する場合です.

インストールに管理者権限が必要なアプリケーションは,管理者に昇格してインストールします.
実行時に管理者権限が必要なアプリケーションは,管理者に昇格して実行します.
インストールや実行時に管理者権限が必要であるかどうかは,アプリケーションによります.

インストールに管理者権限が必要なアプリを管理者に昇格しないでインストールすると,正常にインストールできません.実行時に管理者権限が必要なアプリを管理者に昇格しないで実行すると,正常に動作しない場合があります.
逆に,管理者権限が必要ないのに管理者権限で実行すると,そのアプリの機能の一部が使用できなくなることがあります.


[備考 2]
この [ユーザーアカウント制御] ダイアログで [はい] をクリックしてプログラムを実行しても,そのファイルのブロックが解除されるわけではありません.実行するプログラムファイルと関係するファイルのブロックを解除しておかないと,プログラムが正常に動作しないことがあります.

実行するプログラムがインストーラの場合,ブロックの解除が必要ないインストーラもあります.
つまり,そのプログラムによります.見方を変えると,アプリケーションを開発する側は,そのようなことも考慮する必要があると言えます.


[備考 3]
管理者に昇格して (管理者権限で) 実行すればどんな操作も可能になるわけではありません.管理者に昇格して,更に特権を有効にしないとできない操作もあります.また,最高の権限レベルの特権が必要な操作はできません.