获取模拟的用户名

zza*_*ndy 6 .net impersonation

我有一个类需要知道当前有效的用户名.Environment.UserName或是WindowsIdentity.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"
    ...
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*iwi 6

就是这个(实例成员)

WindowsIdentity.Name
Run Code Online (Sandbox Code Playgroud)

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

你甚至不必调用Impersonate().

编辑

如果没有访问或了解模仿,

WindowsIdentity.GetCurrent(false).Name
(same as)
WindowsIdentity.GetCurrent().Name
Run Code Online (Sandbox Code Playgroud)

应该管用. 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保持不变 - 实际上它仍然是正确的,因为你实际上没有模仿身份,所有你拥有的是一个令牌来访问资源作为辅助身份,而整个程序/线程仍然在originalWindows 下运行身份.

  • 是否可以使用LOGON32_LOGON_NEW_CREDENTIALS模拟的用户“ kinda”的名称? (2认同)

zza*_*ndy 3

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

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

  • zzandy你有误会了。LOGON32_LOGON_NEW_CREDENTIALS 并未真正“模拟”用户,因此正确报告了 WindowsIdentity.Name。更新了我的答案。 (3认同)