gpt4 book ai didi

c# - 模拟时获取当前用户名

转载 作者:可可西里 更新时间:2023-11-01 08:03:34 26 4
gpt4 key购买 nike

我正在使用类似于以下方法的方法在我的代码中模拟用户:

How do you do Impersonation in .NET?

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

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

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

更多详情:

我正在做这个模拟,以便我可以访问网络共享中用户通常无权访问的一些文件。

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

最佳答案

首先,我想指出属性 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
    }
  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
    }

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

其次,让我指出两种情况,LOGON32_LOGON_INTERACTIVELOGON32_LOGON_NEW_CREDENTIALS 之间的区别变得清晰:

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

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

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

关于c# - 模拟时获取当前用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7613468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com