2

C# では、このプロパティが現在のセッションが RDP のセッションであるかどうかを教えてくれることを知っています (そして動作します)。

System.Windows.Forms.SystemInformation.TerminalServerSession

現在、ログオン/ログオフおよびロック/ロック解除イベントを受信するサービスがあり、開始されているセッションが rdp かローカルかをこのサービスに伝える方法が必要です。

問題:サービスはSYSTEMユーザーとして実行され、上記のプロパティは常にfalseを返します(SYSTEMは常にローカル接続ユーザーと見なされるためだと思います)

レジストリで揮発性環境サブキーを検索して、RDP セッション名を識別するサブキーがあるかどうかを確認しようとしました。これはロック/ロック解除ハンドラーで機能しますが、ログオン ハンドラーではサブキーがまだ存在しません (サブキーログイン完了後に作成されます)。

この問題を回避する方法について何か考えはありますか?

限られた時間だけキーの作成を待つことはできますが、「ぎこちない」方法でそれを行いたいと思います。

4

1 に答える 1

2

パラメータを に設定してWTSQuerySessionInformationを呼び出すと、セッションがローカル セッションかリモート セッションかを検出できます。P/Invokes を避けたい場合は、Cassia ライブラリを使用できます: .WTSInfoClassWTSClientProtocolTypenew TerminalServicesManager().GetLocalServer().GetSession(sessionId).ClientProtocolType

警告: これは、セッションが破棄される過程にあるため、(確実に) セッションに関する情報を取得できないため、セッション ログオフ メッセージを処理するときに役に立ちません (ただし、回避するのは比較的簡単に思えます)。また、上記のClientProtocolTypeCassia プロパティはまだリリースされていませんが、ゲストとしてログインして成果物リンクを使用すると、ビルド サーバーからトランク ビルドを取得できます。

于 2012-07-25T15:37:00.037 に答える