WTSQuerySessionInformation返回一个不同的域名

WTSQuerySessionInformation返回一个不同的域名,第1张

概述WTSQuerySessionInformation返回一个不同的域名

我有一个由服务运行的应用程序。 应用程序的configuration方式只能在单个windows用户帐户下运行,也就是安装该软件的用户。 这种处理的方式是在安装过程中,应用程序保存发起安装的用户和服务的用户名/域组合,具体取决于用户会话是否处于活动状态决定运行应用程序。

我们的一位客户报告说,他的账户没有运行应用程序,经过进一步的调查,我们发现由于某种原因,查询会话信息时,返回的域名对于同一个会话ID是不同的。

这是WTSquerySessioninformation的pInvoke:

[Dllimport("WtsAPI32.dll",SetLastError = true)] static extern bool WTSquerySessioninformation( IntPtr hServer,uint sessionID,WTS_INFO_CLASS wtsInfoClass,out IntPtr ppBuffer,out uint pBytesReturned );

这是我们如何获得服务检查,如果用户有一个活动会话:

如何通过互联网更新.net windows应用程序

windowshibernate如何工作

版本控制的生产环境

如何从本地应用程序获取窗口打开/closures/最小化消息?

当文件被locking时,稍后对文件 *** 作进行排队

WTSEnumerateSessions(IntPtr.Zero,1,ref pSessionInfo,ref DWCount); Int32 dataSize = Marshal.SizeOf(typeof(WTS_SESSION_INFO)); Int32 current = (int)pSessionInfo; uint bytes = 0; for (int i = 0; i < DWCount; i++) { WTS_SESSION_INFO si = (WTS_SESSION_INFO)Marshal.PtrToStructure((system.intPtr)current,typeof(WTS_SESSION_INFO)); if (WTS_CONNECTSTATE_CLASS.WTSActive == si.State) { IntPtr userPtr = IntPtr.Zero; IntPtr domainPtr = IntPtr.Zero; //Check if the active session matches the saved username/domain WTSquerySessioninformation(IntPtr.Zero,(uint)si.SessionID,WTS_INFO_CLASS.WTSUsername,out userPtr,out bytes); WTSquerySessioninformation(IntPtr.Zero,WTS_INFO_CLASS.WTSDomainname,out domainPtr,out bytes); string sessionUname = Marshal.PtrToStringAnsi(userPtr); string sessionDomain = Marshal.PtrToStringAnsi(domainPtr); } }

问题是,当服务检测到用户的会话并尝试获取域名时,即使该特定用户的会话ID是正确的,返回的名称也不同于用户的实际域名。

如果它有助于从WTSquerySessioninformation返回的域名是NTLAN_1这是完全不同于用户的实际域。

我想知道WTSquerySessioninformation的pInvoke或上面的代码中的任何调用是否有任何问题。 还想知道NTLAN_1域是否与某种服务或任何types的RDP应用程序相关联。

编辑:

经过多次的谈判,我设法得到了LSAEnumeratelogonSessions和LsaGetlogonSessionData的结果,不幸的是结果是一样的,列出的会话都没有预期的域名。 以下是来自LSAEnumeratelogonSessions的尊重信息的会话列表:

Session: 0 User: MARK *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 2/6/2014 7:34:17 AM Session: 0 User: adminISTRATOR *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 2/4/2014 7:47:11 AM Session: 0 User: adminISTRATOR *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 1/27/2014 3:27:33 PM Session: 0 User: MCMfile2$ *** Domain: NTLAN_1 *** Login Type: (5) Service *** Login Time: 1/16/2014 3:52:46 PM Session: 0 User: MCM-LR9-YE91K$ *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 2/6/2014 10:52:40 AM Session: 0 User: MARK *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 2/6/2014 10:19:39 AM Session: 0 User: adminISTRATOR *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 1/20/2014 9:57:57 AM Session: 0 User: ANONYMOUS logoN *** Domain: NT AUTHORITY *** Login Type: (3) Network *** Login Time: 1/16/2014 3:53:19 PM Session: 1 User: adminISTRATOR *** Domain: NTLAN_1 *** Login Type: (2) Interactive *** Login Time: 1/16/2014 3:53:11 PM Session: 0 User: LOCAL SERVICE *** Domain: NT AUTHORITY *** Login Type: (5) Service *** Login Time: 1/16/2014 3:52:46 PM Session: 0 User: MARK *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 2/6/2014 10:52:40 AM Session: 1 User: adminISTRATOR *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 2/6/2014 10:52:38 AM Session: 0 User: MARK *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 2/6/2014 10:19:39 AM Session: 0 User: adminISTRATOR *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 1/18/2014 6:20:25 PM Session: 0 User: ANONYMOUS logoN *** Domain: NT AUTHORITY *** Login Type: (3) Network *** Login Time: 1/16/2014 3:53:19 PM Session: 0 User: CVSMANAGER_USER *** Domain: MCMfile2 *** Login Type: (5) Service *** Login Time: 1/16/2014 3:53:09 PM Session: 0 User: MCM-LR9-YE91K$ *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 2/6/2014 10:52:40 AM Session: 0 User: MARK *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 2/6/2014 10:19:39 AM Session: 0 User: DefaultAppPool *** Domain: IIS APPPOol *** Login Type: (5) Service *** Login Time: 2/6/2014 8:42:47 AM Session: 0 User: adminISTRATOR *** Domain: NTLAN_1 *** Login Type: (3) Network *** Login Time: 2/4/2014 2:40:40 PM Session: 0 User: IUSR *** Domain: NT AUTHORITY *** Login Type: (5) Service *** Login Time: 1/16/2014 3:53:09 PM Session: 0 User: MCMfile2$ *** Domain: NTLAN_1 *** Login Type: (0) 0 *** Login Time: 1/16/2014 3:52:44 PM

有问题的会话有会话ID = 1。从列表中显示的域名是NTLAN_1,而不是实际的域名。

现在,我在我的桌面应用程序中发现了一些奇怪的东西,我相信它在寻找这个问题的解决scheme中起着至关重要的作用,但我不知道该怎么做。

现在我的桌面应用程序是用.NET编写的,所以我试图通过直接运行应用程序来获取用户名和域名。 现在有趣的是,如果我使用本机GetUsernameEx函数并传递nameUserPrincipal作为nameFormat,我能够得到正确的用户名/域的组合。 然而,这是有趣的部分,当我尝试通过调用Environment.UserDomainname使用Environment类获取域名时,我得到了NTLAN_1的罪魁祸首。 请注意,托pipe和非托pipe调用都是由同一个应用程序在同一个运行中完成的。

我之前没有遇到过这样的问题,现在看来我有更多的用户报告了同样的问题,并且开始困扰我。

使用C#获取连接到命名pipe道服务器的客户端的进程ID

阅读,添加,删除.NET中的windows用户

在IIS中的IP地址和域名限制通过PowerShell

有没有办法使row.DefaultCellStyle.Backcolor固定,尽pipe重绘?

如何以独立于区域的方式查找本地组?

我终于找到了问题,问题的域名实际上是一个UPN后缀,而不是一个域名。 我仍然认为这是一个来自MS的错误,因为WTSquerySessioninformation和LSAEnumeratelogonSessions都应该返回域名而不是UPN后缀。

我能够通过依赖帐户SID而不是用户名/域组合来解决问题,幸运的是,无论使用实际域名还是后缀查询,SID都是一样的。

感谢Harry Johnston对于SID的惊人评论。

太大,以作为评论…希望这是有帮助的… … –

所以…是服务有效地查询本地或远程服务器?

以下是从描述WTSquerySessioninformation函数的MSDN链接中取得的

“在本地服务器上获取会话信息时,只指定WTS_CURRENT_SESSION,如果在远程服务器上查询会话信息时指定了WTS_CURRENT_SESSION,返回的会话信息将不一致,请不要使用返回的数据。

那就是你传入的SessionID参数。而且:

“要在远程桌面服务运行时检索当前会话的会话标识,请调用WTSquerySessioninformation并为SessionID参数指定WTS_CURRENT_SESSION,为WTSInfoClass参数指定WTSSessionID,会话标识将在ppBuffer参数中返回。

更新:尝试使用WTSEnumerateSessionsEx更多的会话信息通过扩展结构WTS_SESSION_INFO_1 ,其本身包含域名…

“pDomainname – 指向以空值终止的字符串的指针,该字符串包含登录到会话的用户的域名。如果没有用户登录到该会话,则该字符串将包含NulL。

不知道如果用户是另一个阴影,它保留了什么。

总结

以上是内存溢出为你收集整理的WTSQuerySessionInformation返回一个不同的域名全部内容,希望文章能够帮你解决WTSQuerySessionInformation返回一个不同的域名所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1289967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存