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