マイクロソフトはWindowsの新しいバージョンをリリースする際に、他のプラットフォームよりは互換性の維持に力を入れていると思います。しかし、それは新しいバージョンが出るのに合わせて、バージョンアップすればという条件付きの場合があります。途中のバージョンをスキップすると、動作しない原因を追跡するのが難しくなります。古い互換性機能の中には、新しいOSでテストされていないこともあるような、ないような……。
Windows XPやWindows Server 2003/2003 R2では、ローカルコンソールからログオンするユーザーは、システムサービスが実行されるのと同じ「セッション0」にログオンしていました。
しかし、これは“セキュリティ上よろしくない”ということで、Windows Vistaでは「セッション0の分離」が行われ、「システムサービスはセッション0専用」「ユーザーはセッション1以降を使用する」ようになりました。セッション0の分離は、Windowsサービスがユーザーのデスクトップと対話するオプション(デスクトップとの対話をサービスに許可)に影響しました。ユーザーはセッション0に対話的にログオンしないようになったからです。
この影響を緩和するため、Windows Vistaでは互換性機能として「Interactive Services Detection(対話型サービスの検出、UI0Detect)」サービスが導入され、セッション0で実行されるサービスがセッション1以降のセッションのユーザーと、引き続き対話することを可能にしました。ただし、セキュリティ上、この機能は可能な限り使用するべきではありません。
Windows Sysinternalsの「PsExec」ユーティリティーは、セッション0内で任意のプログラムを実行し、そのプログラムと対話することを可能にする「-i 0」オプションを提供しています。
例えば、このオプションを使って、次のコマンドラインを実行すると、セッション0内でシステムアカウントの権限でコマンドプロンプトを実行し、そのコマンドプロンプトと対話することができます(画面1)。
psexec -s -i 0 cmd.exe
PsExecは「PSEXEC」という名前のWindowsサービスを一時的に作成してシステムに登録し、セッション0のプログラムがユーザーと対話するためにUI0Detectサービスを利用します。準備ができると「対話型サービスの検出」ダイアログボックスが出現するので、「メッセージの表示」をクリックすると、ユーザーはセッション0内のプログラムと対話することができます(画面2)。
ある日のこと、Windows 10バージョン1607のトラブルシューティングのために、PsExecユーティリティーの「-i 0」」オプションを利用しようとしました(そのときは「Cmd.exeで」はない別のプログラムを実行するため)。しかし、何度実行しても「対話型サービスの検出」ダイアログボックスが表示されません。セッション0内でプログラムは実行されるのですが([Ctrl]+[C]キーで終了することもできる)、そのプログラムと対話することができないのです(画面3)。
「イベントビューアー」で状況を確認すると、「システム」ログに「Interactive Services Detectionサービスは、次のエラーで終了しました:ファンクションが間違っています」という説明のイベントID「7023」のエラーが、PsExecの実行と同じタイミングで、同じ回数だけ記録されていました(画面4)。
試しに、管理ツールの「サービス」を開いて、UI0Detectサービスを手動で開始してみたところ、同じエラー(ファンクションが間違っています)でサービスの開始に失敗しました(画面5)。
Copyright © ITmedia, Inc. All Rights Reserved.