Windows 秘話RunOnce 待ち

Raymond Chen

プロセスの途中でシステムを再起動する必要があるインストールについて考えてみましょう。たとえば、プログラムでは、現在使用中のシステム DLL をアップグレードする必要のある場合があります。新しい DLL ファイルをインストールするには、途中でシステムを再起動する必要があります。また、DLL がアップグレードされたら、インストールの次の段階でその DLL を使用できるようにする必要があります。

RunOnce キーは、このようなシナリオ、つまりセットアップの途中で行われる再起動後にインストール プロセスを完了する必要があるセットアップ プログラムで使用することを目的としていました (これはプログラムには落ち度がないと信じられていた昔の話になりますが)。

Windows® Explorer では、RunOnce プログラムの実行が完了するまでデスクトップやタスク バーを作成しません。これは RunOnce がセットアップ プログラムで使用されるものであるという原則に基づいて動作しているためです。実行中の RunOnce プログラムでは、システム構成データを変更している可能性があり、システムの構成中にユーザーがシステムを使用するのは望ましいことではありません。

たとえば、RunOnce プログラムが、インストールしたばかりのファイルのベース アドレスを再割り当てし、バインドしているとします (そのファイルにはシェル拡張を構成するものもあります)。実行可能ファイルの更新中に、ユーザーがプログラムを実行したり、拡張をアクティブ化するようなことがあっては困ります。

RunOnce が "セットアップ プログラムで使用されるものである" という原則のもう 1 つの落とし穴は、RunOnce キーは、管理者権限を持つユーザーがログオンしている場合にのみ処理されるということです。つまり、管理者以外のユーザーは、インストールを完了することができません。また、管理者以外のユーザーについて RunOnce キーを実行すると、このキーは "一度だけ実行される" というものではなくなってしまいます。これは、大きなジレンマです。では、"この RunOnce は実行済みなので、もう実行しなくてよい" ということを通知するには、どうしたらよいでしょうか。このシステム全体にかかわる状態を変更するには、管理者特権が必要です。当然、管理者以外のユーザーには管理者特権がありません。そのため、このプログラムは 1 回だけ実行されるのではなく、管理者特権を持つユーザーがログオンするまで繰り返し実行されることになります。

  (画像を拡大するには、ここをクリックします)

RunOnce は、プログラムのインストール プロセスを最終確定することを目的としているので、Windows セットアップで認識されます。Service Pack をインストールしたり、新しいバージョンの Windows にアップグレードする際には、セットアップ ウィザードで RunOnce キーが確認されます。このキーに値が設定されている場合は、他のプログラムでインストール プロセスが実行中であること、オペレーティング システムをアップグレードするにはそのインストール プロセスを終了する必要があることを通知するエラー メッセージが表示されます。プログラムのインストール中にオペレーティング システムを変更するのは望ましくないので、これは適切な動作でしょう。

RunOnce のデザインを紐解くと、このキーの過去がわかります。このキーは、Windows 95 で導入されました。Windows 95 では、管理者と管理者以外のユーザーは区別されませんでした。つまり、Windows 95 では、すべてのユーザーが管理者であったので、RunOnce を使用したプログラムは、再起動後に実行する操作について RunOnce に依存することができました。

最近の Windows オペレーティング システム (特に Windows Vista™) では、数か月もの間、管理者特権を持つユーザーがログオンしないという状況が発生し得ます。その結果、RunOnce を実行する必要があるプログラムでは、インストール完了まで非常に長い待ち時間が発生する可能性があります。

余談ですが、私は永続的な RunOnce を見たことがあります。このプログラムでは、プログラムが実行されるたびに RunOnce キーに自身を追加していました。これは、プログラムのインストールではなく、プログラムの通常操作の一環となっているので RunOnce キーの目的に明らかに違反しています。その結果、Windows セットアップでは、インストールが実行中であるというエラーが常に表示されてしまいます。

このように、この迷惑な 1 つのプログラムが永続的にインストール プロセスが実行中であると主張し続けるため、ユーザーはオペレーティング システムをアップグレードできません。このプログラムは、今日の時点ではインストールが完了しませんが、いつかは確実に完了するでしょう。『ゴドーを待ちながら』の話と大差ありませんね。けれども、RunOnce には実存的危機が伴わないことを祈りたいものです。

Raymond Chen の Web サイト The Old New Thing (英語) では、Windows の歴史と Win32 プログラミングを扱っています。現在は、偶然にも『The Old New Thing』(Addison-Wesley、2007 年) というタイトルの書籍の執筆にも取り組んでいます。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.