1

Windows Server 2003 で、自分のプログラムがリモート セッションではなくローカル コンソール (「サーバー マシンの画面上」) で実行されているかどうかを確認するにはどうすればよいですか?

私は Delphi Win32 を使用しているため、Windows API ベースのメソッドはすべて機能するはずです。

4

4 に答える 4

2

WTSGetActiveConsoleSessionId()は、コンソールに接続されたセッションの ID を返す必要があります。次に、そのセッション ID をアプリケーションの現在のセッション ID と比較して、コンソールで実行しているかどうかを判断できます。Vista (Windows Server 2008 については不明) は必ずしもコンソール セッションに 1 の ID を与えるとは限りません (ユーザーの簡易切り替えですか?)。

于 2008-11-05T20:31:10.050 に答える
2

私の場合、ProcessIdToSessionId は、物理コンソールで直接実行した場合と、管理セッション (mstsc /admin) にログインした場合の両方で 0 を返しました。

ただし、RDP 経由でログインすると、Windows (この場合は XP Pro) によって新しいセッションが作成され、物理コンソールに「このコンピューターはロックされています」と表示されます。WTSGetActiveConsoleSessionId は、その 2 番目のセッションのセッション ID (私の場合は 2) を返します。

したがって、アプリがコンソールで実行されていても、現在 2 つのコンソール セッションがあり、アプリはアクティブなセッションで実行されていません。私のコードでは、代わりにセッション ID を 0 と比較します。

于 2009-03-25T14:59:20.460 に答える
2

セッション番号がこれを教えてくれませんか?

ProcessIdToSessionId (GetCurrentProcessId(),&dwSessionNum)

GetVersionEx を使用して、OS のバージョンも確認する必要があります。Vista/2008 の場合、セッション 0 と 1 は両方ともローカル (0 はサービス、1 はコンソール) で、それ以外はすべて仮想です。

あなたの Delphi ユニットはセッション番号を var として宣言するので、アンパサンドは必要ないと思います。

于 2008-10-28T19:16:51.893 に答える
0

Brian の言うとおりです。ユーザーの簡易切り替えが使用されていないにもかかわらず、対話型コンソールのセッション ID が 2 であると報告されている Vista に遭遇しました。もちろん、これは単なるバグかもしれません:-)

于 2008-12-04T10:04:19.817 に答える