模拟时获取当前用户名

Moo*_*ose 13 .net c#

我使用类似下面的方法来模拟我的代码中的用户:

你如何在.NET中进行模拟?

在另一个类中,我需要找出当前用户(如"mydomain\moose"),但我不知道我是否正在冒充其他用户.

如果我冒充某人,我如何获得用户名?

System.Environment.UserName和System.Security.Principal.WindowsIdentity.GetCurrent().Name都返回原始用户,而不是当前模拟的用户.

更多细节:

我正在进行此模拟,以便我可以访问用户通常无权访问的netowrk共享中的某些文件.

如果我使用登录类型的LOGON32_LOGON_INTERACTIVE,我确实看到了新用户,但我无法访问网络共享.如果我使用登录类型的LOGON32_LOGON_NEW_CREDENTIALS(值为9),我可以访问网络共享但我没有在Environment.UserName中看到新用户.

Han*_*ans 20

开始编辑: 我意识到我第一次回答这个问题并不是很清楚.所以,我想开始另一次尝试:

首先,我想指出WindowsIdentity.GetCurrent().Name如果您使用LOGON32_LOGON_NEW_CREDENTIALSLOGON32_LOGON_INTERACTIVE作为LogonUser(在模拟类内部)函数的登录类型,属性将返回什么:

  1. 运用 LOGON32_LOGON_INTERACTIVE

    // Assuming this code runs under USER_B
    
    using (var imp = new Impersonation("treyresearch", "USER_A", "SecurePwd", LOGON32_LOGON_INTERACTIVE ))
    {
      // Now, we run under USER_A
      Console.Out.WriteLine(WindowsIdentity.GetCurrent().Name); // Will return USER_A
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运用 LOGON32_LOGON_NEW_CREDENTIALS

    // Assuming this codes runs under USER_B
    
    using (var imp = new Impersonation("treyresearch", "USER_A", "SecurePwd", LOGON32_LOGON_NEW_CREDENTIALS ))
    {
      Console.Out.WriteLine(WindowsIdentity.GetCurrent().Name); // Will return USER_B
    }
    
    Run Code Online (Sandbox Code Playgroud)

这是您在问题中描述的行为,并且与MSDN上的LogonUser功能描述一致.对于LOGON32_LOGON_NEW_CREDENTIALS创建的用户令牌,它只是当前用户令牌的克隆.这意味着创建的用户会话具有与调用线程相同的标识符.传递给该LogonUser功能的凭据仅用于出站网络连接.

其次,让我指出了两次情况之间的差异说明LOGON32_LOGON_INTERACTIVE,并LOGON32_LOGON_NEW_CREDENTIALS变得清晰:

  • 两个域加入的计算机:computer_A,computer_B
  • 两个用户:user_A(计算机_A上的本地管理员),user_B(仅B上的标准用户权限)
  • 计算机_B上的一个网络共享(mynetworkshare,user_B确实有权访问共享).
  • computer_A上的一个本地文件夹(只有user_A有权写入此文件夹).

您在computer_A上运行程序(在user_A帐户下).您模拟user_B(使用LOGON32_LOGON_INTERACTIVE).然后,您连接到computer_B上的网络共享,并尝试将文件复制到本地文件夹(只有user_A有权写入此文件夹).然后,您将收到拒绝访问错误消息,因为文件操作是使用user_B的权限完成的,该权限对本地文件夹没有权限.

与上述情况相同.但现在,我们LOGON32_LOGON_NEW_CREDENTIALS用来模仿user_B.我们连接到网络驱动器并将文件从网络驱动器复制到本地文件夹.在这种情况下,操作成功,因为文件操作是使用user_A的权限完成的.

结束编辑

希望这可以帮助.

  • 这是对LOGON32_LOGON_NEW_CREDENTIALS如何工作的优秀解释.谢谢! (5认同)

Muh*_*han 5

根据http://msdn.microsoft.com/en-us/library/chf6fbt4.aspx上的示例,当前身份在模仿期间会发生变化.您确定您的代码在模拟代码块中吗?