用C ++获取用户的login会话

我想获得父进程explorer.exe进程的当前login会话的句柄。

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

我search了一些地方,但我只是得到loginSID的过程。 如果有人想要更多的信息,可以下载http://technet.microsoft.com/en-us/sysinternals/bb896653并在资源pipe理器中 – >右键点击任何正在执行的程序 – >安全。 在这里你会findlogin会话。

Solutions Collecting From Web of "用C ++获取用户的login会话"

您可以通过使用OpenProcessToken和带有TokenStatistics选项的GetTokenInformation获取与进程关联的登录会话。 但是,这并不是一个明智的方法,可以通过“以管理员身份运行”来确定是否启动了一个进程,因为没有直接的方法可以确定某个特定的登录会话是否升级。 以“以管理员身份运行”启动的进程不会有登录会话。

要找出进程是否以管理员身份运行,请使用TokenElevationType选项。 当且仅当使用“以管理员身份运行”时,这应该返回TokenElevationTypeFull

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

如果您真正想知道的是该进程是否具有管理权限,则应该使用CheckTokenMembership 。 查找管理员组。 MSDN文档具有这样的示例代码。

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

您可以调用GetCurrentProcess获取当前进程的句柄,然后使用它调用OpenProcessToken为当前进程获取访问令牌。 一旦你有了,你可以调用GetTokenInformation来请求TokenSessionId 。

编辑:

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