获取与桌面关联的登录Windows用户名
我希望枚举系统中的所有桌面,并获取该桌面的登录用户名。 到目前为止,我有以下代码snippit作为获取HDESK句柄并试图确定与之关联的用户名称(如果有的话)的示例,但对LookupAccountSid的调用失败,并显示ERROR_NONE_MAPPED(“帐户名称和安全ID之间没有映射完成“)。
HDESK desk = OpenDesktop( "Default", 0, FALSE, READ_CONTROL | DESKTOP_READOBJECTS );
DWORD size = 4096;
SID * sid = (SID *)malloc( size );
GetUserObjectInformation( desk , UOI_USER_SID, sid, size, &size );
char name[512], domain[512];
int namesz = 512, domainsz = 512;
LookupAccountSid( NULL, sid, &name, &namesz, &domain, &domainsz, &s);
这可能是因为我通过GetUserObjectInformation而不是用户SID提取登录SID。 如果是的话,我可以将其转换为登录用户的SID?
任何人都可以指向正确的方向来获取任意桌面的登录用户名(通过它的相应HDESK或HNWD手柄,甚至桌面的HWINSTA手柄)? 提前致谢。
如果你想要的是用户信息,那么这将工作。
调用WTSEnumerateSessions来获得一个WTS_SESSION_INFO结构数组。 对于每个结构,将SessionId成员传递给WTSQuerySessionInformation并将WTSInfoClass成员设置为WTSUserName。 这将为您提供与会话相关的用户名(如果有的话)。
或者,您可以将WTSInfoClass设置为WTSSessionInfo并返回WTSINFO结构。 这包含了很多信息,包括用户名和域名。 虽然MSDN页面错误,但请查看WTSINFO的头文件定义。
您必须调用WTSEnumerateSessions两次,才能获得所需的缓冲区大小,然后再获取一次信息。
关系:一个或多个Desktop对象位于Windows Station中。 Windows Station与会话相关联。
问题是桌面根本不与用户关联。 尝试使用psexec在SYSTEM帐户下运行记事本。 它在你的窗口站台上,桌面上运行。 否则,你将无法看到它。
但是,如果你想获得与窗口站相关的会话,那么是的,这是可能的。 您需要使用ObjectNameInformation调用NtQueryObject以获取对象的名称。 例如,这里是我得到的: Sessions1WindowsWindowStationsWinSta0 。 有你的会话ID。
这不是一个解决方案,但是可以很好地描述电台/桌面。 从http://www.microsoft.com/technet/security/bulletin/fq00-020.mspx
什么是Windows站? Windows站点是一个安全容器,包含剪贴板,一些全局信息和一组一个或多个桌面。 Windows 2000会话将包含多个窗口站点,一个分配给交互式用户的登录会话,另一个分配给Winlogon进程,安全屏幕保护程序进程以及在安全环境中运行的任何服务,而不是交互式用户用户。 分配给交互式用户的登录会话的交互式窗口站还包含键盘,鼠标和显示设备。 交互式窗口站对用户是可见的并且可以接收来自用户的输入。 所有其他窗口工作站都是非交互式的,这意味着它们不能被用户看到,并且不能接收用户输入。
什么是桌面? 桌面是包含在窗口站内的安全容器对象。 Windows站点中可能包含许多桌面。 桌面具有逻辑显示表面并包含窗口,菜单和挂钩。 只有交互式窗口站的桌面可以看到并接收用户输入。 在交互式窗口工作站上,一次只有一个桌面处于活动状态。 这个活动桌面也称为输入桌面,是当前用户可以看到并接收用户输入的桌面。
链接地址: http://www.djcxy.com/p/43959.html上一篇: Get the logged in Windows user name associated with a desktop
