1

次の API 呼び出しを使用して、ターミナル サーバー セッションでリモート クライアントの名前を特定しています。

ret = WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, 
                                 WTS_INFO_CLASS.WTSClientName, buffer, bufferLen)

通常、アプリケーションがターミナル サーバー セッションで実行されていないbuffer場合、呼び出しは成功し (ret != 0)、単に null ポインターを返します。したがって、これは予想される動作であると考えました。

しかし、ある顧客のマシンでは、関数が失敗し始め (ret == 0)、GetLastError5: アクセスが拒否されました。(いつものように、顧客は自分のシステム構成はまったく変更されていないと主張しています。)

だから、私の質問は次のとおりです。

  • 非ターミナル サービス マシン (たとえば、「通常の」Windows 7 PC など) で WTSClientName をクエリすると、どのような動作が予想されますか?
  • このエラー コードが返される理由は何ですか? テスト マシンでは、ユーザーが管理者権限を持っていなくても、関数呼び出しは常に期待どおりに動作することに注意してください (成功し、バッファーが空になります)。

これが関連しているかどうかはわかりませんが、Web アプリケーション内から関数を呼び出すことで、この問題 (エラー 5) を再現できます。ただし、この場合はそうではありません (通常の Windows アプリケーションです)。

4

3 に答える 3

1

私はあなたに同意します。また、クライアントのシステム構成の一部が変更されていると思います。ファイル システムまたはレジストリの変更のうちどれが重要かを調べるには、Process MonitorWTSQuerySessionInformationを使用してみてください。

また、ツールをダウンロードし、Process Monitor を開始してから、使用するテスト プログラムを開始しWTSQuerySessionInformation、ログを保存して投稿するよう顧客に依頼することもできます。ログに「アクセスが拒否されました」というエラーが表示されると思います。クライアントのコンピューターの構成の問題を見つけるのに役立つことを願っています。

于 2011-03-09T23:55:59.173 に答える