kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

なぜWindowsのログオンする際にCtrl + Alt + Delが必要?

twitterで「なぜユーザー切り替えの前にCtrl + Alt + Delを押さなくてはならないの?」という話が出ていました。
ログオフせずにユーザーを切り替える - Microsoft Windows ヘルプ
まず最初にお約束。以下の内容は記憶100%で書いているので、中身をまるっきり信じないでください。
このキーの由来はPC/ATMS-DOSで使われていた時代までさかのばらなくてはなりません。PC-9801はちょっと記憶が正しくないですが、PC/ATではCtrl + Alt + Delを押すと、ソフトウェアリセット(つまり再起動)がかかりました。
世の中にはいろいろ考える人がいるもので、今でいうマルウェアがこのキーを乗っ取って、いろいろ破壊活動を仕掛けるものも多くありました。今のマルウェアは、迷惑メールを送ったり、アカウント情報を取得するものが主流ですが、昔はディスクの中身を壊すもの、操作不能にするもののほうが多かったと記憶しています。
で、Windows NT 3.1ではこのようなマルウェアに対抗するために、画面を論理的に3つに分割しました。スクリーンセーバーと、通常のUI画面、そしてログオン画面です。Windows NT 3.1ではそれぞれの画面間で、相互干渉をできないようにしました。そして、ログオン画面からユーザー画面に遷移するためのキーイベントにCtrl + Alt + Delという役割を持たされました。
これでこのキーは(OSに問題がない限り)マルウェアに使われることがなくなりました。ただ、いろいろな事情があって、自動ログオンしたいという要求は常にあります。典型的な理由は「サーバー側でサービスとして実装されていないアプリケーションを常時動かしておきたい」というものです。
もうひとつ、意外と見落とされますが、外字(EUDC)があります。外字はWindowsのログオンユーザーごとに設定されます。したがって「誰かがログオンしていないと外字が使えない」という現象が発生します。これを救うためのAPIであるEnableEUDCなんてのも用意されています。個人的には「システム外字」みたいなのがあってもいいのではないかと思うんですが、Windows 3.0(だったかな?)のころからこうなってしまっています。したがって、サーバーで帳票を作るような場合、そして外字を使うようなシステムでは日夜自動ログオンがあるとかないとか…。
これもWindows Server 2008でサービス(Session 0)とユーザーセッション(Session 1以降)が分離されてしまったので、サービスで外字を出したい場合は前述のEnableEUDC()を呼び出すことになります。ただ、このAPI、そこそこ失敗するので、かなりどきどきです。