WTSQuerySessionInformation有时会因“拒绝访问”而失败

时间:2011-03-09 15:15:57

标签: winapi terminal-services

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

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应用程序)。

3 个答案:

答案 0 :(得分:1)

我同意你的观点,并且假设客户端系统配置中的某些内容已更改。要找出文件系统或注册表中的哪些更改对WTSQuerySessionInformation很重要,您可以尝试使用Process Monitor

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

read more about session 0