2

現在のすべてのユーザーセッションを列挙し、それらのセッションIDを取得し、後でどのプロセスがどのセッションで実行されているかを確認する必要があるサービスアプリケーションを作成しています。WTSEnumerateSessions()APIを使用しているだけでなくWTSQuerySessionInformation()、セッション固有の情報を取得しています。残念ながら、これらのWTSAPIは非常に信頼性がありません。

ユーザーの高速切り替えがオフになっているWindowsXPマシン、またはドメインに参加しているXPマシンでは、これらのAPIはすぐには利用できません。RPC_S_INVALID_BINDINGWindows XPが起動してサービスが開始されてから数分間、または1702のエラーコードで失敗する可能性があります。

そのような制限を処理する方法を説明する公式のドキュメントは見つかりませんでした。検索エンジンを介して利用できるのは、ターミナルサービスサービスがロードされるのを待つことです。これはもちろん可能ですが、実装するのに大きな苦痛になります

だから、誰かが次のように答えることができれば私はそれをいただければ幸いです:

  1. それらのWTSのものよりも信頼性の高い、セッション固有のデータを処理するための代替APIはありますか?ほとんどの場合、マシン上の現在のセッションを確認し、ユーザー名とセッションステータスを取得する必要があります。また、各プロセスのセッションIDを使用してプロセスを列挙します。(GINAまたはログイン画面は、ターミナルサービスがロードされる前に、すべての方法で実行できるため、これが可能であることを私は知っています。)
  2. Windows Vista / Windows 7マシンのいずれかのバージョンでサービスが起動する前に、 WTSクラスのAPI(、、など)が読み込まれることを100%保証していWTSEnumerateSessions()ますWTSQuerySessionInformation()WTSEnumerateProcesses()

非常に重要なおよび規定に注意してください。

4

3 に答える 3

4

役立つ可能性のあるもう1つのAPIは、フィールドを持つLsaEnumerateLogonSessionsおよびLsaGetLogonSessionDataSECURITY_LOGON_SESSION_DATA ですSessionコード例これを参照してください。プロセスのセッションに関する情報を取得するには、パラメーターとしてGetTokenInformationを使用できTokenSessionIdます。プロセスを列挙するには、 NtQuerySystemInformationを使用できます(私の古い回答を参照)。

于 2011-10-28T23:19:09.247 に答える
3

ここで提案されているいくつかの解決策があります。要約すれば:

  1. 「TermSrv」が実行されていることを確認します(依存関係を介して、手動で開始/待機するなど)。
  2. 「Global\TermSrvReadyEvent」イベントが設定されるのを待ちます。
于 2011-10-28T23:16:20.423 に答える
1

これらのAPIは、0より大きい任意のセッションでプロセスを作成するために機能する必要があるため、Vista /7では2番目の質問が保証されていると思います。

于 2011-10-28T23:28:18.620 に答える