-1

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

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

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

错误代码1723的描述:“RPC服务器太忙,无法完成此操作”</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 服务
  • 包 3 当前 UI 文化:en-US
  • 当前文化: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

服务:

名称:警报器启动模式:禁用状态:停止名称:应用层网关服务启动模式:手动状态:运行名称:Apple 移动设备启动模式:自动状态:运行名称:应用程序管理启动模式:手动状态:停止名称:ASP。 NET 状态服务启动模式:手动状态:停止名称:Ati HotKey Poller 启动模式:自动状态:运行名称:Windows 音频启动模式:自动状态:运行名称:后台智能传输服务启动模式:自动状态:运行名称:Bonjour 服务启动模式:自动状态:运行名称:计算机浏览器启动模式:自动状态:运行名称:索引服务启动模式:手动状态:停止名称:剪贴簿启动模式:禁用状态:停止名称:.NET 运行时优化服务 v2.0.50727_X86 启动模式:手动状态:停止名称:COM+ 系统应用程序启动模式:手动状态:停止名称:加密服务启动模式:自动状态:运行名称:DCOM 服务器进程启动器启动模式:自动状态:运行名称:DHCP 客户端启动模式:自动状态:运行名称:逻辑磁盘管理器管理服务启动模式:手动状态:停止名称:逻辑磁盘管理器启动模式:自动状态:运行名称:DNS客户端启动模式:自动状态:运行名称:有线 AutoConfig 启动模式:手动状态:停止名称:可扩展身份验证协议服务启动模式:手动状态:停止名称:错误报告服务启动模式:禁用状态:停止名称:事件日志启动模式:自动状态:运行名称:COM+ 事件系统启动模式:手动状态:运行名称:快速用户切换兼容性启动模式:手动状态:停止名称:FlipShare 服务启动模式:自动状态:运行名称:Windows Presentation Foundation Font Cache 3.0.0.0 启动模式:手动状态:停止名称:帮助和支持 启动模式:自动 状态:运行名称:HID 输入服务启动模式:自动 状态:运行名称:健康密钥和证书管理服务启动模式:手动状态:已停止名称:HTTP SSL 启动模式:手动状态:已停止名称:InstallDriver 表管理器启动模式:手动状态:已停止名称:Windows CardSpace 启动模式:手动状态:已停止名称:IMAPI CD-Burning COM 服务启动模式:禁用状态:停止名称:iPod 服务启动模式:手动状态:停止名称:Java Quick Starter 启动模式:禁用状态:停止名称:服务器启动模式:自动状态:运行名称:工作站启动模式:自动状态:运行名称:TCP/IP NetBIOS 助手启动模式:自动状态:运行名称:McAfee Framework 服务启动模式:自动状态:运行名称:McAfee McShield 启动模式:自动状态:运行名称:McAfee 任务管理器启动模式:自动状态:运行名称:机器调试管理器启动模式:自动状态:运行名称:Messenger 启动模式: 已禁用 状态:已停止 名称:Vision Control Manager 启动模式:已禁用 状态:已停止 名称:NetMeeting 远程桌面共享 启动模式:已禁用 状态:已停止 名称:分布式事务协调器 启动模式:手动 状态:已停止 名称:Windows Installer 启动模式:手动状态:已停止名称:网络访问保护代理启动模式:手动状态:已停止名称:网络 DDE 启动模式:已禁用 状态:已停止 名称:网络 DDE DSDM 启动模式:已禁用 状态:已停止 名称:网络登录 启动模式:自动 状态:运行 名称:网络连接 启动模式:手动 状态:运行 名称:Net.Tcp 端口共享服务启动模式:禁用状态:停止名称:网络位置感知 (NLA) 启动模式:手动状态:运行名称:NLCS 代理启动模式:自动状态:运行名称:NT LM 安全支持提供程序启动模式:禁用状态:停止名称:可移动存储启动模式:手动状态:停止名称:Microsoft Office 诊断服务启动模式:禁用状态:停止名称:Office Source Engine 启动模式:手动 状态:停止 名称:即插即用 启动模式:自动 状态:运行 名称:Pml Driver HPZ12 启动模式:自动 状态:停止 名称:IPSEC 服务 启动模式:自动 状态:运行 名称:受保护的存储启动模式:自动状态:运行名称:远程访问自动连接管理器启动模式:手动状态:停止名称:远程访问连接管理器启动模式:手动状态:停止名称:远程桌面帮助会话管理器启动模式:手动状态:停止名称:路由和远程访问启动模式:禁用状态:停止名称:远程注册表启动模式:禁用状态:停止名称:远程过程调用 (RPC) 定位器启动模式:手动状态:停止名称:远程过程调用 (RPC) 启动模式:自动状态:运行名称:QoS RSVP 启动模式:手动状态:停止名称:安全帐户管理器启动模式:自动状态:运行名称:智能卡启动模式:手动状态:已停止名称:任务计划程序启动模式:自动状态:运行名称:辅助登录启动模式:自动状态:运行名称:系统事件通知启动模式:自动状态:运行名称:Windows防火墙/Internet 连接共享 (ICS) 启动模式:自动状态:运行名称:Shell 硬件检测启动模式:自动状态:运行名称:Print Spooler 启动模式:自动状态:运行名称:系统还原服务启动模式:自动状态:停止名称:SSDP 发现服务启动模式:手动状态:运行名称:Windows 图像采集 (WIA) 启动模式:自动状态:运行名称: MS Software Shadow Copy Provider 启动模式:手动 状态:已停止 名称:系统接口 服务启动模式:自动 状态:运行 名称:性能日志和警报 启动模式:已禁用 状态:已停止 名称:电话 启动模式:已禁用 状态:已停止 名称:终端服务启动模式:手动状态:运行名称:主题启动模式:禁用状态:停止名称:Telnet 启动模式:禁用状态:停止名称:分布式链路跟踪客户端启动模式:自动状态:运行名称:通用即插即用设备主机启动模式:手动状态:停止名称:不间断电源启动模式:禁用状态:停止名称:卷影复制启动模式:手动 状态:已停止 名称:Windows 时间 启动模式:自动 状态:运行 名称:WebClient 启动模式:自动 状态:运行 名称:Windows Defender 启动模式:自动 状态:运行 名称:Windows Management Instrumentation 启动模式:自动 状态:运行名称:戴尔无线 WLAN 托盘服务启动模式:自动状态:运行名称:Portable Media 序列号服务启动模式:已禁用状态:已停止名称:Windows Management Instrumentation 驱动程序扩展启动模式:手动状态:已停止名称:WMI 性能适配器启动模式:手动状态:已停止名称:Windows Media Player 网络共享服务启动模式:手动状态:已停止名称:安全中心启动模式:自动状态:已停止名称:Windows 搜索启动模式:自动状态:运行名称:自动更新启动模式:自动状态:运行名称:Windows 驱动程序基础 - 用户模式驱动程序框架启动模式:手动状态:停止名称:无线零配置启动模式:自动状态:停止名称:Network Provisioning Service 启动模式:手动 状态:已停止

流程:

名称:系统空闲进程工作集: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 工作集:23972KBexe 工作集:2304KB 名称:stsystra.exe 工作集:8100KB 名称:Mctray.exe 工作集:2396KB 名称:ctfmon.exe 工作集:3252KB 名称:DyKnowLogSender.exe 工作集:23972KBexe 工作集:2304KB 名称:stsystra.exe 工作集:8100KB 名称:Mctray.exe 工作集:2396KB 名称:ctfmon.exe 工作集:3252KB 名称:DyKnowLogSender.exe 工作集:23972KB

4

2 回答 2

1

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

于 2010-02-20T20:05:52.587 回答
0

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

于 2009-11-12T09:01:54.087 回答