0

我想获取父进程为 explorer.exe 的当前登录会话的句柄。

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

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

4

2 回答 2

4

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

编辑:

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

于 2012-10-04T00:22:19.490 回答
2

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

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

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

如果您真正想知道该进程是否具有管理权限,则应CheckTokenMembership改为使用。查找管理员组。MSDN 文档有完全执行此操作的示例代码。

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

于 2012-10-04T02:46:40.620 回答