获取模拟的用户名

时间:2011-03-01 10:20:50

标签: .net impersonation

我有一个类需要知道当前有效的用户名。 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"
    ...

我可以控制模拟代码,但我更愿意将其与解决方案的其他部分保持独立。

2 个答案:

答案 0 :(得分:6)

就是这个(实例成员)

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

  

false如果线程模拟,则返回线程的WindowsIdentity,如果线程当前没有模拟,则返回进程的WindowsIdentity。

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

答案 1 :(得分:3)

好吧,问题似乎是属性非个性化登录类型。

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