1

我需要获取 GetTokenInformation 返回的 AuthenticationID 和 TokenStatistics 类,用于登录到工作站的用户,无论我是否被提升。

让我给你一些更多的信息。假设我这样做:

var Result = GetTokenInformation(WindowsIdentity.GetCurrent().Token, TOKEN_INFORMATION_CLASS.TokenStatistics, TokenInformation, TokenInfLength, out TokenInfLength);

这将允许我毫无问题地从 TokenInformation 结构中获取 AuthenticationID。假设生成的 authenticationID 是“00000000-00001234”

现在,如果我右键单击 Visual Studio 并单击“以管理员身份运行”,再次启动我的代码,结果将是其他内容,例如“00000000-00001289”。但我需要“00000000-00001234”

无论当前进程是否提升,如何获得“00000000-00001234”?

我想这只是找到合适的 Token 给 GetTokenInformation 的问题,但我在这里绕着圈子跑......

注意:我的代码基于如何在 C# 中获取登录 SID以实现 GetTokenInformation,然后对其进行调整以获取 TokenStatistics。

4

1 回答 1

3

好的,我终于让它工作了。这些是步骤(没有发布完整的代码,它很长):

  1. 在win32_process类+托管进程类上递归使用WMI(ManagementObject)来创建当前进程的祖先
  2. 在我的特殊情况下,当我找到“资源管理器”进程或遇到异常时,我会停止算法,因为资源管理器很可能没有被提升。
  3. 在步骤 2 返回的 ProcessId 上 P/Invoke 从 advapi32.dll 中的 OpenProcessToken 函数。这将为您提供一个 userToken,可用于构造您可以在步骤 4 中使用的新 WindowsIdentity
  4. 然后,您可以将该 WindowsIdentity 令牌属性提供给 GetTokenInformation 以取回您的 AuthenticationID。

这是经过测试和工作的。

参考 :

如果您发现此过程有任何问题,请不要犹豫发表评论或发布您自己的答案!


注意:如果其中一个父进程已被杀死,则会出现问题:WMI 将为您提供一个不再存在的进程的 ID。我正在工作的产品的性质让我不时重新启动资源管理器(仅在开发期间),这就是我看到问题的方式。这对我来说不是一个真正的问题,但很高兴知道。

谢谢

于 2012-04-02T09:05:07.967 回答