【问题标题】:Get impersonated user name获取模拟用户名
【发布时间】:2011-07-06 09:45:29
【问题描述】:

我有一个类需要知道当前有效的用户名。 Environment.UserNameWindowsIdentity.GetCurrent().Name 就是为此。但是当启用模拟时,它们返回 LocalUser 名称而不是 ImpersonatedUser 名称。

如何获取当前冒充用户的姓名?

该应用程序是 C# 控制台应用程序,我知道模拟是有效的,因为我获得了ImpersonatedUser 的特权。当然我可以让模拟代码将模拟的用户名保存到某个全局变量中,但这是错误的。

更新:

模拟代码:

if (LogonUser(userName, domain, password, LOGON32_LOGON_NEW_CREDENTIALS/*=9*/, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
  if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
  {
    WindowsIdentity tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
    _impersonationContext = tempWindowsIdentity.Impersonate();

    // WindowsIdentity.GetCurrent().Name equals "LocalUser" 
    // while userName equals "ImpersonatedUser"
    ...

我可以控制模拟代码,但我希望它独立于解决方案的其他部分。

【问题讨论】:

  • 查看 WindowsIdentity.Impersonate 的演示代码 - 看起来 GetCurrent().Name 应该可以工作
  • 由于某种原因它对我不起作用,请参阅问题更新。

标签: .net impersonation


【解决方案1】:

就是这个(实例成员)

WindowsIdentity.Name

http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx

您甚至不必调用 Impersonate()。

编辑

在没有访问权限或不知道假冒的情况下,

WindowsIdentity.GetCurrent(false).Name
(same as)
WindowsIdentity.GetCurrent().Name

应该可以。 http://msdn.microsoft.com/en-us/library/x22bbxz6.aspx

如果线程正在模拟,则返回线程的 WindowsIdentity;如果线程当前未模拟,则返回进程的 WindowsIdentity。


如果您使用的是 LOGON32_LOGON_NEW_CREDENTIALS,请记住 (http://www.pcreview.co.uk/forums/logonuser-issues-t1385578.html) 登录的上下文保持不变,同时为远程资源创建第二个令牌 - 这就是您的 WindowsIdentity.Name 保持不变的原因 - 实际上它仍然是正确的,因为您还没有实际上冒充身份,您所拥有的只是一个令牌,可以作为辅助身份访问资源,而整个程序/线程仍在original Windows 身份下运行。

【讨论】:

  • WindowsIdentity 不提供任何静态属性,WindowsIdentity.GetCurrent().Name 返回 LocalUser 的名称。
  • 我以为你在控制模仿
  • 我正在控制模拟,但它发生在与需要用户名的模块不同的模块中,我想让它们分开。
  • 是否有可能获得使用 LOGON32_LOGON_NEW_CREDENTIALS 冒充的用户名称?
【解决方案2】:

好的,看来问题出在属性非个性化登录类型上。

如果在非个性化代码中将 LOGON32_LOGON_NEW_CREDENTIALS (9) 替换为 LOGON32_LOGON_INTERACTIVE (2) 一切正常 - WindowsIdentity.GetCurrent().NameEnvironment.UserName 都按预期返回 ImpersonatedUser。

【讨论】:

  • zzandy 你误会了。 LOGON32_LOGON_NEW_CREDENTIALS 并没有真正“模拟”用户,因此 WindowsIdentity.Name 被正确报告。更新了我的答案。
猜你喜欢
  • 2013-04-19
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 2010-10-23
相关资源
最近更新 更多