プログラムがローカルコンソールで実行されているかどうかを確認する方法
質問
Windows Server 2003では、プログラムがリモートセッションではなくローカルコンソール(「サーバーマシンの画面上」)で実行されているかどうかを確認するにはどうすればよいですか?
Delphi Win32を使用しているため、Windows APIベースのメソッドはすべて動作します。
解決
セッション番号はこれを教えてくれませんか?
ProcessIdToSessionId(GetCurrentProcessId()、& dwSessionNum)
GetVersionExを使用してOSのバージョンも確認する必要があります。XP/ Server 2003セッション0まではすべてローカル(サービスまたはインタラクティブコンソール)であり、それ以上は仮想です。 Vista / 2008では、セッション0と1は両方ともローカル(0はサービス、1はコンソール)であり、その他はすべて仮想です。
Delphiユニットはセッション番号をvarとして宣言するので、アンパサンドは必要ないと思います。
他のヒント
WTSGetActiveConsoleSessionId()は、コンソールに接続されたセッションのID。次に、そのセッションIDをアプリケーションの現在のセッションIDと比較して、コンソールで実行しているかどうかを判断できます。 Vista(Windows Server 2008について不明)は、必ずしもコンソールセッションにID 1(高速ユーザースイッチング、だれでも?)を与えるとは限りません。
私にとっては、物理コンソールで直接実行した場合と管理セッション(mstsc / admin)にログインした場合の両方で、ProcessIdToSessionIdは0を返しました。
ただし、RDP経由でログインすると、Windows(この場合はXP Pro)が新しいセッションを作成し、「このコンピューターはロックされています」という物理コンソールに表示されます。表示。 WTSGetActiveConsoleSessionIdは、2番目のセッション(この場合は2)のセッションIDを返します。
したがって、アプリがコンソールで実行されていても、2つのコンソールセッションがあり、アプリはアクティブなセッションで実行されていません。私のコードでは、代わりにセッションIDを0と比較しています。
ブライアンは正しいです。それ以来、ユーザーの簡易切り替えが使用されていなかったにもかかわらず、Vistaが対話型コンソールのセッションID 2を報告していることに遭遇しました。もちろん、これは単なるバグかもしれません:-)