【问题标题】:When a process is elevated how can I get the windows authentication ID of the non elevated session提升进程时,如何获取非提升会话的 Windows 身份验证 ID
【发布时间】:2012-03-26 14:14:06
【问题描述】:

无论我是否被提升,我都需要使用 TokenStatistics 类获取 GetTokenInformation 返回的 AuthenticationID。

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

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 的问题,但我在这里绕着圈子跑......

注意:我的代码基于 How to get the logon SID in C# 来实现 GetTokenInformation,然后对其进行调整以获取 TokenStatistics。

【问题讨论】:

    标签: c# windows uac advapi32 process-elevation


    【解决方案1】:

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

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

    这是经过测试和工作的。

    参考:

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


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

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 2011-04-25
      • 2011-08-03
      相关资源
      最近更新 更多