WTSQueryUserToken 失败,getlasterror() 返回 1723

Posted

技术标签:

【中文标题】WTSQueryUserToken 失败,getlasterror() 返回 1723【英文标题】:WTSQueryUserToken Fails, getlasterror() returns 1723 【发布时间】:2009-11-11 15:12:23 【问题描述】:

我有一个在系统帐户凭据下运行的 Windows 服务。该服务定期轮询窗口以获取活动控制台会话 ID,即交互式登录的 Windows 用户,然后通过调用 wtsapi32.dll 函数 WTSQueryUserToken(...) 检索与活动控制台会话 ID 关联的用户令牌。此实施在现场 99.9% 的时间都完美无缺。然而,最近,我发现一个客户的这种实现会定期(但从未一致地)无法检索到活动控制台会话 ID 的用户令牌。

在这篇文章的底部查看客户的操作系统信息。

当 WTSQueryUserToken() 失败时,GetLastError() 返回 Windows 系统错误代码 1723。

错误代码1723的描述:“RPC服务器太忙,无法完成此操作”

这里是演示实现的示例代码 sn-p:

int ActiveSession = 0;
Win32Wrapper.GetActiveConsoleSessionId(ref ActiveSession);
IntPtr UserToken = IntPtr.Zero;

if(!Win32Wrapper.WTSQueryUserToken(ActiveSession, ref UserToken))

   int myErr = Convert.ToInt32(Win32Wrapper.GetLastError());
   log("Failed to retrieve UserToken." + myErr.ToString());
   return;

else

   log("Retrieved User Token");

有谁知道罪魁祸首是什么?

这是客户的设置:

身份验证:活动目录 操作系统: Microsoft Windows NT 5.1.2600 服务 Pack 3 当前 UI 文化:zh-CN 当前文化:en-US CLR 版本:2.0.50727.3603 IE版本:8.0.6001.18702 系统类型:32 位免费 物理内存:总计 411MB 物理内存:893MB 系统 制造商:戴尔公司 型号:Vostro 1000 处理器 1:AMD Athlon(tm) 64 X2 双核处理器 TK-57

服务:

名称:警报器 启动模式:禁用 状态:停止 名称:应用层网关服务 启动方式:手动 状态:运行 名称:苹果移动设备 启动模式:自动 状态:运行 名称:应用管理 启动方式:手动 状态:停止 名称:ASP.NET 状态服务 启动方式:手动 状态:停止 名称:Ati HotKey Poller 启动模式:自动 状态:运行 名称:视窗音频 启动模式:自动 状态:运行 名称:后台智能传输服务 启动模式:自动 状态:运行 名称:卓悦服务 启动模式:自动 状态:运行 名称:电脑浏览器 启动模式:自动 状态:运行 名称:索引服务 启动方式:手动 状态:停止 名称:剪贴簿 启动模式:禁用 状态:停止 名称:.NET 运行时优化服务 v2.0.50727_X86 启动方式:手动 状态:停止 名称: COM+系统应用程序 启动方式:手动 状态:停止 名称:加密服务 启动模式:自动 状态:运行 名称:DCOM 服务器进程启动器 启动模式:自动 状态:运行 名称:DHCP客户端 启动模式:自动 状态:运行 名称:逻辑磁盘管理器管理服务 启动方式:手动 状态:停止 名称:逻辑磁盘管理器 启动模式:自动 状态:运行 名称:DNS客户端 启动模式:自动 状态:运行 名称:有线自动配置 启动方式:手动 状态:停止 名称:可扩展身份验证协议服务 启动方式:手动 状态:停止 名称:错误报告服务 启动模式:禁用 状态:停止 名称:事件日志 启动模式:自动 状态:运行 名称:COM+事件系统 启动方式:手动 状态:运行 名称:快速用户切换兼容性 启动方式:手动 状态:停止 名称:FlipShare 服务 启动模式:自动 状态:运行 名称:Windows Presentation Foundation 字体缓存 3.0.0.0 启动方式:手动 状态:停止 名称:帮助和支持 启动模式:自动 状态:运行 名称:HID 输入服务 启动模式:自动 状态:运行 名称:健康密钥和证书管理服务 启动方式:手动 状态:停止 名称:HTTP SSL 启动方式:手动 状态:停止 名称:InstallDriver 表管理器 启动方式:手动 状态:停止 名称:Windows CardSpace 启动方式:手动 状态:停止 名称:IMAPI CD-Burning COM 服务 启动模式:禁用 状态:停止 名称:iPod服务 启动方式:手动 状态:停止 名称:Java 快速入门 启动模式:禁用 状态:停止 名称:服务器 启动模式:自动 状态:运行 名称:工作站 启动模式:自动 状态:运行 名称: TCP/IP NetBios 助手 启动模式:自动 状态:运行 名称:迈克菲框架服务 启动模式:自动 状态:运行 名称: McAfee McShield 启动模式:自动 状态:运行 名称:迈克菲任务管理器 启动模式:自动 状态:运行 名称:机器调试管理器 启动模式:自动 状态:运行 名称:信使 启动模式:禁用 状态:停止 名称:视觉控制经理 启动模式:禁用 状态:停止 名称:NetMeeting 远程桌面共享 启动模式:禁用 状态:停止 名称:分布式事务协调器 启动方式:手动 状态:停止 名称:Windows 安装程序 启动方式:手动 状态:停止 名称:网络访问保护代理 启动方式:手动 状态:停止 名称:网络 DDE 启动模式:禁用 状态:停止 名称:网络 DDE DSDM 启动模式:禁用 状态:停止 名称:网络登录 启动模式:自动 状态:运行 名称:网络连接 启动方式:手动 状态:运行 名称:Net.Tcp 端口共享服务 启动模式:禁用 状态:停止 名称:网络位置感知 (NLA) 启动方式:手动 状态:运行 名称: NLCS 代理 启动模式:自动 状态:运行 名称:NT LM 安全支持提供者 启动模式:禁用 状态:停止 名称:可移动存储 启动方式:手动 状态:停止 名称:Microsoft Office 诊断服务 启动模式:禁用 状态:停止 名称:Office 源引擎 启动方式:手动 状态:停止 名称:即插即用 启动模式:自动 状态:运行 名称: Pml Driver HPZ12 启动模式:自动 状态:停止 名称:IPSEC 服务 启动模式:自动 状态:运行 名称:受保护的存储 启动模式:自动 状态:运行 名称:远程访问自动连接管理器 启动方式:手动 状态:停止 名称:远程访问连接管理器 启动方式:手动 状态:停止 名称:远程桌面帮助会话管理器 启动方式:手动 状态:停止 名称:路由和远程访问 启动模式:禁用 状态:停止 名称:远程注册表 启动模式:禁用 状态:停止 名称:远程过程调用 (RPC) 定位器 启动方式:手动 状态:停止 名称:远程过程调用 (RPC) 启动模式:自动 状态:运行 名称:QoS回复 启动方式:手动 状态:停止 名称:安全帐户经理 启动模式:自动 状态:运行 名称:智能卡 启动方式:手动 状态:停止 名称:任务计划程序 启动模式:自动 状态:运行 名称:二次登录 启动模式:自动 状态:运行 名称:系统事件通知 启动模式:自动 状态:运行 名称:Windows 防火墙/Internet 连接共享 (ICS) 启动模式:自动 状态:运行 名称:外壳硬件检测 启动模式:自动 状态:运行 名称:打印后台处理程序 启动模式:自动 状态:运行 名称:系统还原服务 启动模式:自动 状态:停止 名称:SSDP 发现服务 启动方式:手动 状态:运行 名称:Windows 图像采集 (WIA) 启动模式:自动 状态:运行 名称:MS Software Shadow Copy Provider 启动方式:手动 状态:停止 名称:系统接口服务 启动模式:自动 状态:运行 名称:性能日志和警报 启动模式:禁用 状态:停止 名称:电话 启动模式:禁用 状态:停止 名称:终端服务 启动方式:手动 状态:运行 名称:主题 启动模式:禁用 状态:停止 名称:远程登录 启动模式:禁用 状态:停止 名称:分布式链接跟踪客户端 启动模式:自动 状态:运行 名称:通用即插即用设备主机 启动方式:手动 状态:停止 名称:不间断电源 启动模式:禁用 状态:停止 名称:卷影复制 启动方式:手动 状态:停止 名称:视窗时间 启动模式:自动 状态:运行 名称:WebClient 启动模式:自动 状态:运行 名称:Windows Defender 启动模式:自动 状态:运行 名称:Windows 管理规范 启动模式:自动 状态:运行 名称:戴尔无线 WLAN 托盘服务 启动模式:自动 状态:运行 名称:便携式媒体序列号服务 启动模式:禁用 状态:停止 名称:Windows Management Instrumentation 驱动程序扩展 启动方式:手动 状态:停止 名称:WMI 性能适配器 启动方式:手动 状态:停止 名称:Windows Media Player 网络共享服务 启动方式:手动 状态:停止 名称:安全中心 启动模式:自动 状态:停止 名称:Windows 搜索 启动模式:自动 状态:运行 名称:自动更新 启动模式:自动 状态:运行 名称:Windows Driver Foundation - 用户模式驱动程序框架 启动方式:手动 状态:停止 名称:无线零配置 启动模式:自动 状态:停止 名称:网络供应服务 启动方式:手动 状态:停止

进程:

名称:系统空闲进程 工作集:28KB 名称:系统 工作集:244KB 名称:smss.exe 工作集:428KB 名称:csrss.exe 工作集:3984KB 名称:winlogon.exe 工作集:3944KB 名称:services.exe 工作集:3612KB 名称:lsass.exe 工作集:5344KB 名称:ati2evxx.exe 工作集:3036KB 名称:svchost.exe 工作集:5076KB 名称:svchost.exe 工作集:5384KB 名称:MsMpEng.exe 工作集:39384KB 名称:svchost.exe 工作集:23792KB 名称:svchost.exe 工作集:4280KB 名称:svchost.exe 工作集:4944KB 名称:WLTRYSVC.EXE 工作集:1652KB 名称:BCMWLTRY.EXE 工作集:9820KB 名称:spoolsv.exe 工作集:8364KB 名称:svchost.exe 工作集:5356KB 名称:AppleMobileDeviceService.exe 工作集:4284KB 名称:mDNSResponder.exe 工作集:4368KB 名称:FlipShareService.exe 工作集:5316KB 名称:FrameworkService.exe 工作集:6048KB 名称:mcshield.exe 工作集:55800KB 名称:vstskmgr.exe 工作集:564KB 名称:mdm.exe 工作集:2748KB 名称:csagtprosvc.exe 工作集:5644KB 名称:naPrdMgr.exe 工作集:2044KB 名称:svchost.exe 工作集:4308KB 名称:searchindexer.exe 工作集:20460KB 名称:svchost.exe 工作集:21864KB 名称:unsecapp.exe 工作集:3828KB 名称:alg.exe 工作集:4336KB 名称:wmiprvse.exe 工作集:7576KB 名称:ati2evxx.exe 工作集:3600KB 名称:explorer.exe 工作集:33096KB 名称:SynTPEnh.exe 工作集:4736KB 名称:WLTRAY.EXE 工作集:6644KB 名称:MSASCui.exe 工作集:7824KB 名称:shstat.exe 工作集:820KB 名称:UdaterUI.exe 工作集:2304KB 名称:stsystra.exe 工作集:8100KB 名称: Mctray.exe 工作集:2396KB 名称:ctfmon.exe 工作集:3252KB 名称:DyKnowLogSender.exe 工作集:23972KB

【问题讨论】:

【参考方案1】:

我曾经遇到过这个问题。所以我建议稍后再重复这个调用(使用睡眠)。如果它工作 99%,那么它很可能会在尝试多次后工作。我还会添加一个计数器,这样就没有无限循环了。

【讨论】:

【参考方案2】:

Win32Wrapper.GetLastError 实际上是在调用 GetLastError 吗?无法从托管代码可靠地调用该函数。相反,您应该将 SetLastError=true 添加到设置错误的所有函数(在您的情况下为 WTSQueryUserToken)的 DllImport 属性中,然后使用 Marshal.GetLastWin32Error() 检查结果。

【讨论】:

感谢 Mattias,我的 DLLImport 语句没有设置属性。我会将您的建议合并到一个示例程序中,以查看 Marshal.GetLastWin32Error() 是否返回不同的错误代码。

以上是关于WTSQueryUserToken 失败,getlasterror() 返回 1723的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PollingIntervalTest test_getlastupdate_no_change 在 Sonos Self-Test Suite 中因错误“无法将字符串转换为浮点数”而失败

无密码的 CreateProcessAsUser 和 LogonUser

从服务的用户会话中创建进程

如何在 Windows 服务中启动 GUI 程序?

C++课堂练习一

实现线程安全的单例模式