首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冒充用户名

冒充用户名
EN

Stack Overflow用户
提问于 2011-03-01 10:20:50
回答 2查看 7.7K关注 0票数 7

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

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

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

更新:

模拟代码:

代码语言:javascript
复制
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"
    ...

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-01 11:51:29

好的,似乎是出现了属性模拟登录类型的问题。

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

票数 3
EN

Stack Overflow用户

发布于 2011-03-01 10:25:34

只有这个(实例成员)

代码语言:javascript
复制
WindowsIdentity.Name

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

您甚至不需要调用Impersonate()。

编辑

在不了解或不知道冒充的情况下

代码语言:javascript
复制
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标识下运行时,它将访问资源作为次要标识。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5153161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档