【问题标题】:WTSQuerySessionInformation sometimes failing with "Access Denied"WTSQuerySessionInformation 有时会因“拒绝访问”而失败
【发布时间】:2011-03-09 15:15:57
【问题描述】:

我正在使用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 应用程序)。

【问题讨论】:

    标签: winapi terminal-services


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        read more about session 0

        【讨论】:

          猜你喜欢
          • 2012-01-02
          • 1970-01-01
          • 2011-02-09
          • 1970-01-01
          • 2012-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多