1

我正在使用以下 API 调用来确定终端服务器会话中远程客户端的名称:

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

通常,当应用程序没有在终端服务器会话中运行时,调用成功(ret != 0)并且buffer只返回一个空指针。所以我认为这是预期的行为。

然而,在一位客户的机器上,该函数开始失败(ret == 0)并GetLastError返回 5:拒绝访问。(像往常一样,客户声称他的系统配置没有任何变化。)

所以,我的问题如下:

  • 在非终端服务机器(例如,“常规”Windows 7 PC)上查询 WTSClientName 时的预期行为什么?
  • 返回此错误代码的原因可能是什么?请注意,在我们的测试机器上,函数调用总是按预期运行(成功和空缓冲区),即使用户没有管理权限。

我不知道这是否相关,但我们可以通过从 Web 应用程序内部调用该函数来重现此问题(错误 5)。但是,在这种情况下并非如此(它是一个常规的 Windows 应用程序)。

4

3 回答 3

1

我同意你的看法,并且还假设客户端的系统配置发生了一些变化。要从文件系统或注册表的更改中找出哪一项对您很重要,WTSQuerySessionInformation您可以尝试使用Process Monitor

您还可以要求您的客户下载该工具,启动 Process Monitor,然后启动您使用的测试程序WTSQuerySessionInformation,保存日志并将其发布给您。我想,您会在日志中看到一些“拒绝访问”错误。希望能帮助您找到客户电脑配置中的问题。

于 2011-03-09T23:55:59.173 回答
0

我不知道预期的行为,但在 Win7 上调用 WTSEnumerateSessions 时遇到错误代码 5,访问被拒绝。设置DWORD HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\AllowRemoteRPC1并立即修复问题。

于 2017-07-18T11:52:44.883 回答
0

当您从 Web 应用程序调用它时会发生这种情况,因为 Web 服务器正在 Windows 的(会话 0)下运行。

阅读有关会话 0 的更多信息

于 2019-07-03T07:06:21.080 回答