2012-03-26 52 views
1

我需要获得GetTokenInformation返回的AuthenticationID与TokenStatistics类的登录在站上的用户是否升高或不。当一个进程被提升时,我怎么能得到非提升会话的windows身份验证ID

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

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

这将允许我从TokenInformation结构中获得AuthenticationID而没有问题。假设生成的验证ID为“00000000-000”

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

如何获得“00000000-000”当前进程是否升高?

我想这只是找到合适的令牌给到GetTokenInformation的问题,但我这里手忙脚乱......

注:我根据我的代码上How to get the logon SID in C#实施GetTokenInformation,然后将它改编能够获得TokenStatistics。

回答

3

好的,我终于明白了。这些步骤如下(未发布完整的代码,这是相当长):在Win32_Process类+托管Process类递归

  1. 使用WMI(的ManagementObject)创建当前进程的祖先
  2. 在我的特别如果我找到“资源管理器”进程或当我遇到异常时停止算法,因为很可能浏览器未升级。从ADVAPI32.DLL
  3. P /调用OpenProcessToken功能上一步2.这让你可以用来构建一个新的WindowsIdentity,您可以在步骤4使用
  4. 然后,您可以养活一个userToken返回的ProcessID WindowsIdentity令牌属性GetTokenInformation取回您的AuthenticationID。

这是测试和工作。

参考:

如果您看到这个程序的任何问题不要犹豫,发表评论或发表你自己的答案!


注:有,如果父进程中的一个已经被杀死了一个问题:WMI会给你已经不存在的进程的ID。我工作的产品的性质让我不时重新启动浏览器(仅在开发期间),这就是我看到问题的方式。这对我来说并不是一个问题,但很高兴知道。

谢谢

相关问题