2011-03-09 14 views
1

我使用the following API call确定在终端服务器会话的远程客户端的名称:WTSQuerySessionInformation有时与“拒绝访问”未能

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

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

然而,在一个客户的机器上,该功能开始失败(ret == 0)并且GetLastError返回5:拒绝访问。 (像往常一样,顾客声称,他的系统配置并没有以任何方式更改。)

所以,我的问题有以下几种:

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

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

回答

1

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

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

0

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