プログラムがローカルコンソールで実行されているかどうかを確認する方法

StackOverflow https://stackoverflow.com/questions/244397

  •  04-07-2019
  •  | 
  •  

質問

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を報告していることに遭遇しました。もちろん、これは単なるバグかもしれません:-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top