使用C ++获取用户的登录会话

时间:2012-10-04 00:01:42

标签: c++ windows winapi sessionid pid

我想了解其父级是explorer.exe的进程的当前登录会话。

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

我搜索了很多地方,但我只是获得了登录SID的过程。如果有人想了解更多信息,您可以下载http://technet.microsoft.com/en-us/sysinternals/bb896653并在资源管理器下 - >右键单击任何正在执行的程序 - >安全。在这里,您将找到登录会话。

2 个答案:

答案 0 :(得分:4)

您可以调用GetCurrentProcess来获取当前进程的句柄,然后使用该句柄调用OpenProcessToken以获取当前进程的访问令牌。完成后,您可以致电GetTokenInformation申请TokenSessionId

修改

我只是想到了你可以尝试的其他东西:你可以申请TokenOwner而不是会话ID,一旦你拥有了它,你就拥有了一个安全描述符。然后,您可以调用LookupAccountSid以获取与描述符关联的帐户名称。然后,您可以检查“管理员”或其他一些。

答案 1 :(得分:2)

您可以使用OpenProcessToken后跟GetTokenInformation TokenStatistics选项来获取与流程相关联的登录会话。但是,这不是一种明智的方法,可以找出是否使用“以管理员身份运行”启动进程,因为没有直接的方法来确定特定的登录会话是否被提升。使用“以管理员身份运行”启动的进程不会有登录会话。

要确定某个流程是“以管理员身份运行”,请使用TokenElevationType选项。当且仅当“以管理员身份运行”时才会返回TokenElevationTypeFull

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

如果您真正想知道的是该流程是否具有管理权限,则应使用CheckTokenMembership代替。查找Administrators组。 MSDN documentation包含完全相同的示例代码。

此处的区别是,如果禁用UAC(并且用户是管理员)或用户是本地管理员,您希望发生什么。在这些情况下,没有“以管理员身份运行”选项,所有进程都自动以管理员权限运行。如果要检测这些情况,请使用CheckTokenMembership。如果您只想检测用户明确说“以管理员身份运行”的情况,请使用TokenElevationType