ここから本文です

トラブルシューター泣かせのWindowsの仕様変更

4/12(水) 6:10配信

@IT

 Windows XPやWindows Server 2003/2003 R2では、ローカルコンソールからログオンするユーザーは、システムサービスが実行されるのと同じ「セッション0」にログオンしていました。

Windows 7では利用できたPsExecユーティリティーのテクニックがWindows 10では機能しない?

 しかし、これは“セキュリティ上よろしくない”ということで、Windows Vistaでは「セッション0の分離」が行われ、「システムサービスはセッション0専用」「ユーザーはセッション1以降を使用する」ようになりました。セッション0の分離は、Windowsサービスがユーザーのデスクトップと対話するオプション(デスクトップとの対話をサービスに許可)に影響しました。ユーザーはセッション0に対話的にログオンしないようになったからです。

 この影響を緩和するため、Windows Vistaでは互換性機能として「Interactive Services Detection(対話型サービスの検出、UI0Detect)」サービスが導入され、セッション0で実行されるサービスがセッション1以降のセッションのユーザーと、引き続き対話することを可能にしました。ただし、セキュリティ上、この機能は可能な限り使用するべきではありません。

 Windows Sysinternalsの「PsExec」ユーティリティーは、セッション0内で任意のプログラムを実行し、そのプログラムと対話することを可能にする「-i 0」オプションを提供しています。

 例えば、このオプションを使って、次のコマンドラインを実行すると、セッション0内でシステムアカウントの権限でコマンドプロンプトを実行し、そのコマンドプロンプトと対話することができます。

psexec -s -i 0 cmd.exe

 PsExecは「PSEXEC」という名前のWindowsサービスを一時的に作成してシステムに登録し、セッション0のプログラムがユーザーと対話するためにUI0Detectサービスを利用します。準備ができると「対話型サービスの検出」ダイアログボックスが出現するので、「メッセージの表示」をクリックすると、ユーザーはセッション0内のプログラムと対話することができます。

●セッション0と対話できる「psexec -i 0」がWindows 10では使えない?

 ある日のこと、Windows 10バージョン1607のトラブルシューティングのために、PsExecユーティリティーの「-i 0」」オプションを利用しようとしました(そのときは「Cmd.exeで」はない別のプログラムを実行するため)。しかし、何度実行しても「対話型サービスの検出」ダイアログボックスが表示されません。セッション0内でプログラムは実行されるのですが([Ctrl]+[C]キーで終了することもできる)、そのプログラムと対話することができないのです。

 「イベントビューアー」で状況を確認すると、「システム」ログに「Interactive Services Detectionサービスは、次のエラーで終了しました:ファンクションが間違っています」という説明のイベントID「7023」のエラーが、PsExecの実行と同じタイミングで、同じ回数だけ記録されていました。

 試しに、管理ツールの「サービス」を開いて、UI0Detectサービスを手動で開始してみたところ、同じエラー(ファンクションが間違っています)でサービスの開始に失敗しました。

●Windows 8からサービスとの対話が既定で無効に

 Webを検索してみると、すぐにこれはWindowsの既定値の変更の影響であることが判明しました。しかも、その既定値が変更されたのは、Windows 8のときでした。

 サービスがユーザーとの対話を許可するレジストリキーは、「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows」の「NoInteractiveServices」値です。Windows 7までのNoInteractiveServices値の既定値は「0」、つまり、サービスによるユーザーとの対話は既定で許可されていました。それが、Windows 8からは既定値が「1」に変更され、“既定では許可されなくなった”のです。

 そういえば、そんな仕様変更があったなぁと、そのときようやく思い出しました。仕様が変更されたときに、その影響に気が付けば分かりますが、そうでなければ、なかなか気が付かないものです。しかも、エラーメッセージが「ファンクションが間違っています」ではなおさらです。

●Windows 10のセッション0でマウスとキーボードが利かないバグ?

 Windows 10でレジストリを変更(【筆者注】セキュリティ上、推奨されない設定です)してみると、PsExecユーティリティーで実行したセッション0のプログラムと対話できるようになりました。と思いましたが、正確には対話できていませんでした。対話しているように見えるだけです。なぜかというと、マウスとキーボードが反応しないのです。いろいろ試してみて、使えたのは[Ctrl]+[Alt]+[Del]キーによるセッションの切断だけでした。

 Windows 10バージョン1607の問題なのかと思い、Windows 10バージョン1511でも試しましたが、状況は変わりませんでした。Windows 8.1ではどうかというと、ちゃんと機能します。

 ここまでをまとめると、以下のようになります。

・Windows Vistaにおける「セッション0の分離」のアプリケーションへの影響の一部を緩和するために、セッション0のサービスと対話を可能にするInteractive Services Detectionサービスが導入される。
・Windows 7では変更なし。
・Windows 8において、サービスとの対話を既定で無効化(NoInteractiveServicesの既定値変更)。
・Windows 8.1では変更なし。
・Windows 10では、サービスとの対話機能がテストされていない疑惑あり。

 さて、Windows 10 Creators Updateではどうなることでしょう(この問題以外にもいろいろと気になりますが)。気の早い人は既にCreators Updateを入手してアップグレードしたかもしれませんが、互換性問題が発生する可能性や未知の(公開されていない)仕様変更の影響を考えると、しばらく様子を見るのが無難と思います。

 Windows 10 HomeエディションはWindows Updateで「機能更新プログラム」として配布されればアップグレードが開始されてしまいます。Windows 10 Pro以上のエディションでは「設定」の「更新とセキュリティ」→「Windows Update」(「ファイル名を指定して実行」で「ms-settings:windowsupdate」を実行することで開けます)から「詳細オプション」を開き、「機能の更新を延期する」をチェックしておくと、Windows Updateによる配布を先延ばしにできます。

 自分が使用しているPCのモデルやデバイス、アプリケーションの互換性をメーカーのWebサイトなどで確認し、HDDの空き領域を確認した上でCreators Updateにアップグレードすることをお勧めします。もちろん、その前にフルバックアップを取得しておくことを強くお勧めします。

 Windows 10 Creators Updateへのアップグレードについては、次回、レポートします。

[山市良,テクニカルライター]

最終更新:4/12(水) 6:10
@IT