-->

获得在C用户的登录会话++(Get the logon session of a user in C

2019-08-01 03:11发布

我想要得到的进程当前登录会话,其父母为Explorer.exe的一个手柄。

如果我们运行的过程作为系统管理员或服务将不会有一个登录会话。 我想要得到的登录会话的原因是,我有一个程序(.exe),我希望当用户试图通过打开它限制开口(右键单击该.exe - >以管理员身份运行),并当用户打开它通过管理员,我们没有用它,而当用户通过双击打开它关联的登录会话,它有一个与之关联的登录会话。

我搜索颇有些地方,但我只是得到了越来越登录SID的过程。 如果有人想了解更多信息,可以下载http://technet.microsoft.com/en-us/sysinternals/bb896653和探险家下- >右键点击执行任何程序- >安全。 你会发现这里的登录会话。

Answer 1:

你可以通过使用进程关联的登录会话OpenProcessToken随后GetTokenInformationTokenStatistics选项。 然而,这是不是找出一个过程是否被使用“以管理员身份运行”启动,因为没有确定特定的登录会话是否升高与否没有直接的方法一种合适的方式。 这是不正确的,与所启动的进程“以管理员身份运行”不会有一个登录会话。

要了解一个过程是否“以管理员身份运行”使用TokenElevationType选项。 这应返回TokenElevationTypeFull当且仅当“以管理员身份运行”被使用。

(警告:我不能确定什么TokenElevationType 。如果非管理用户使用“以管理员身份运行”,然后输入管理员用户名和密码,将返回您应该测试这种情况下,您可能需要使用。 TokenElevation而非TokenElevationType 。 )

如果你真的想知道什么是进程是否具有管理权限,你应该使用CheckTokenMembership代替。 寻找Administrators组。 在MSDN文档有示例代码正是这样做的。

这里的区别是你想要什么发生,如果UAC被禁用(以及用户是管理员),或者如果用户是本地管理员。 在这种情况下有没有“以管理员身份运行”选项,所有的进程都具有管理员权限自动运行。 如果你想检测到这些情况,使用CheckTokenMembership 。 如果你只是想以检测用户明确表示“以管理员身份运行”使用情况TokenElevationType



Answer 2:

您可以拨打GetCurrentProcess得到一个句柄到当前进程,然后用它来调用OpenProcessToken有当前进程的访问令牌。 一旦你的,你可以调用GetTokenInformation请求TokenSessionId 。

编辑:

我只是想的其他你可以尝试的东西:不是会话ID,您可以要求TokenOwner ,一旦你有,你有一个安全描述符。 然后,您可以调用执行LookupAccountSid获取与描述符相关联的帐户名称。 然后,你可以检查,对“管理员”或一些这样的。



文章来源: Get the logon session of a user in C++