使用模拟时获取真实登录用户

Posted

技术标签:

【中文标题】使用模拟时获取真实登录用户【英文标题】:Get real logged in user when impersonation is used 【发布时间】:2014-04-09 15:05:44 【问题描述】:

这是一个很难研究的问题......当使用模拟时,我如何获得登录的“真实”用户的名称?我知道如果我关闭模拟然后重新打开,这是可能的,但在我的情况下这很困难,我正在寻找更简单的方法。

我尝试了以下方法,这些都指向 ImpersonationUser: Environment.UserName WindowsIdentity.GetCurrent().Name SystemInformation.Username

这是模拟用户的代码(不确定它有多大帮助):

        if (LogonUser(userName, "ABDATA", pwd, LogonSessionType.Interactive, LogonProvider.Default, ref this._userToken))
        
            if (DuplicateToken(this._userToken, SecurityImpersonationLevel.SecurityImpersonation, ref this._impersonationToken))
            
                this._identity = new WindowsIdentity(this._impersonationToken, "Kerberos", WindowsAccountType.Normal, true);
                this._impersonationContext = this._identity.Impersonate();
                System.Threading.Thread.CurrentPrincipal = new WindowsPrincipal(this._identity);
            
            else
            
                Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
            
        

我们基本上想要这个模拟用户的权限,以便它可以访问某些文件,但希望能够显示实际登录用户的名称以用于问责。

真的正在寻找任何解决方案.. 谢谢。

【问题讨论】:

你不能在模拟块之前获取真实用户名并将其分配给变量吗? 这是我想到的第一件事,也是困难所在。不幸的是,在我可以传递该参数的方法和需要它的方法之间有一堵墙。称为 Type.InvokeMember 的东西。基本上,这是一种执行“事务”(不是 SQL 事务)并且事务具有步骤的方法。我需要将变量带到这些步骤之一,但似乎我不能。当我进行定义时,它会将我带到元数据。 ASP.NET 应用程序还是桌面应用程序? @DonalLafferty 这是一个桌面应用程序。 【参考方案1】:

在ThreadStatic field中缓存用户详细信息?

【讨论】:

以上是关于使用模拟时获取真实登录用户的主要内容,如果未能解决你的问题,请参考以下文章

如何在Unix中获取登录用户的真实姓名?

Google OAuth2 登录 - 获取 YouTube 昵称和真实电子邮件地址

获取真实ip的报告

后台获取在模拟器中工作但在真实设备中不工作

在木兰中获取用户名

我试图在真实设备上运行登录活动时出错(在模拟器上运行完美)