Winapi WTSQuerySessionInformation有时会出现“失败”的情况;“拒绝访问”;

Winapi WTSQuerySessionInformation有时会出现“失败”的情况;“拒绝访问”;,winapi,terminal-services,Winapi,Terminal Services,我正在使用来确定终端服务器会话中远程客户端的名称: ret = WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTS_INFO_CLASS.WTSClientName, buffer, bufferLen) 通常,当应用程序未在终端服务器会话中运行时,调用成功(ret!=0),并且buffer仅返回空指针。所以我认为这是预期

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

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

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


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

我同意您的看法,并且还假设客户端系统配置中的一些问题已更改。要从文件系统或注册表中的更改中找出对
WTSQuerySessionInformation
重要的更改,您可以尝试使用


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

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

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

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


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