今日は、Windows 7 / Windows Server 2008 R2 の新機能 - コンソール ホスト (ConHost.exe) を紹介します。
実際、一般ユーザーであろうと企業管理者であろうと、私たちは日常の Windows アプリケーションや運用および保守プロセスで多かれ少なかれコンソール アプリケーションを使用します。コンソール アプリケーションにはユーザー インターフェイスがありません。コマンド プロンプト (CMD、これは DOS ではありません。多くの人が混乱しています) を通じて入出力操作を実行する必要があります。
考えてみましょう。Windows にはどのようなコンソール アプリケーションが付属しているのでしょうか?
実際、最も一般的なものには、cmd.exe、nslookup.exe、telnet.exe などがあります。
以前のバージョンの Windows では、非 GUI アクティビティを表すすべてのアプリケーション (つまり、コンソール アプリケーション) は、デスクトップ上で実行する場合、システム プロセス Csrss.exe を通じて調整されていました。コンソール アプリケーションが文字を受信する必要がある場合、Kernel32.dll 内の小さな「コンソール API」を呼び出して、Kernel32 に CSRSS を呼び出すための LPC を生成させます。このとき、CSRSS はコンソール ウィンドウの入力キューをチェックして検証し、関連付けのために Kernel32 を通じてキャラクター モードの結果をコンソール アプリケーションに返します。初期の Windows バージョンにおけるコンソール アプリケーションのメッセージ処理メカニズムを次の図に示します。
この処理メカニズムにより問題が発生しました。コンソール アプリケーションが通常のユーザーのコンテキストで実行された場合でも、Csrss.exe は常にローカル システム アカウントのアクセス許可で実行されます。したがって、場合によっては、「悪者」によって開発されたマルウェアが、ローカル システム アカウントのアクセス許可で実行される Csrss.exe を通じて、より多くの権限を取得する可能性があります。この攻撃モードはシャッターアタックと呼ばれます。
Win7 および Windows Server 2008 R2 の時代では、すべてのコンソール アプリケーションは実行のために新しいコンテキスト プロセス ConHost.exe に配置され、ConHost (コンソール ホスト) とコンソール プログラムはその中で実行されるのではなく、同じセキュリティ レベルのコンテキストで実行されます。 LPC メッセージが処理のために CSRSS に要求されると、代わりに ConHost が要求されます。したがって、アプリケーションがメッセージ要求を悪用して特権を自動的に昇格させようとしても、成功しません。次の図は、Windows 7 および Windows Server 2008 R2 で使用される新しいメカニズムの概略図です。
ConHost は、コンソール アプリケーションによる I/O 処理方法の永続的な変更を置き換えます。ユーザーは、レジストリやグループ ポリシーを介して Windows を強制的に「レガシー モード」のコンソール動作に戻すことはできません。したがって、ユーザーは Windows 7 または Windows Server 2008 R2 にアップグレードする前に、アプリケーションを徹底的にテストする必要があります。一部のアプリケーションのほとんどの機能は GUI を通じて実装されていますが、データはバックグラウンドでコンソールまたはその他の機能インターフェイスを通じてバッチ処理されることを忘れないでください。したがって、移行または平準化の前に、包括的なアプリケーション機能テストを実施することが非常に必要です。
Windows 7 でアプリケーションが正常に使用できない場合は、まず管理者権限でアプリケーションをテストし、再度実行して問題が発生するかどうかを確認します。その後、プロセス モニターを使用して、アプリケーションのファイルまたはレジストリへのアクセス権を監視できます。正常です。上記の問題のトラブルシューティングを行ってもアプリケーションが正常に実行できない場合は、ISV またはその開発者に連絡することを検討する必要があります。
アプリケーションがクラッシュした場合、開発者や ISV が問題の核心を見つけるには、対応するクラッシュ ダンプ ファイルが最も役立ちます。アプリケーションが応答を停止した場合は、ADPlus を使用してアプリケーションとそれに関連する ConHost.exe プロセス ダンプを取得してみてください。コンソール アプリケーションは、Windows コンソールの多くのサブプロセスを共有できます。たとえば、ユーザーが CMD ウィンドウから Telnet を起動すると、Telnet.exe は Cmd.exe のサブプロセスになります。この場合、ConHost.exe ホストは、親プロセスと子プロセスの両方のメッセージ インスタンスを処理します。 Process Explorer を使用すると、ConHost.exe がどのプロセスを処理しているかを確認できます。
Windows 7 リソース モニターの「待機チェーンの分析」機能を使用して、ConHost.exe プロセスのアプリケーション プロセスを表示することもできます。
最後に、移行前にアプリケーションを完全にテストすることを忘れないでください。