【问题标题】:How to get Windows user name using different methods?如何使用不同的方法获取 Windows 用户名?
【发布时间】:2011-03-11 15:22:08
【问题描述】:

在 .NET 中,似乎有几种方法可以获取当前的 Windows 用户名。其中三个是:

string name = WindowsIdentity.GetCurrent().Name;

string name = Thread.CurrentPrincipal.Identity.Name;

string name = Environment.UserName;

有什么区别,为什么选择一种方法而不是另一种?还有其他方法吗?

【问题讨论】:

  • System.Threading.Thread.CurrentPrincipal.Identity.Name 呢??
  • @marc_s:添加了您的建议。

标签: c# .net windows credentials userid


【解决方案1】:

Environment.UserName 在 advapi32.dll 中调用 GetUserName。这意味着,如果您冒充其他用户,此属性将反映这一点。

Thread.CurrentPrincipal 有一个设置器,可以通过编程进行更改。 (顺便说一句,这不是冒充。)

WindowsIdentity 是您当前的 windows 身份(如果有)。它不一定反映用户,想想带有 FormsAuthentication 的 ASP.NET。然后 WindowsIdentity 将是 NT 服务,但 FormsIdentity 将是登录用户。还有一个 PassportIdentity,您可以构建自己的东西以使事情进一步复杂化。

【讨论】:

  • “模拟”是否意味着如果您通过“运行方式...”运行某些内容?
  • @Andy,我没试过。但是 WindowsIdentity 类有一个 Impersonate() 方法,我很确定 it 会进行模拟。 ;)
【解决方案2】:

您要求其他方法。

当然,您始终可以使用本机 Windows API:GetUserName

【讨论】:

    【解决方案3】:

    我相信该属性被放置在几个地方,以便程序员更容易找到。只有一个登录用户,并且只有一个各自的名称。

    【讨论】:

    • 那么暗示,所有这些方法都是可以互换的?
    • 我相信是的。我希望这里没有细微的差别。
    【解决方案4】:

    三种方法描述如下:

    HttpContext = HttpContext.Current.User,它返回一个 IPrincipal 对象,其中包含当前 Web 请求的安全信息。这是经过身份验证的 Web 客户端。

    WindowsIdentity = WindowsIdentity.GetCurrent(),返回当前执行的 Win32 线程的安全上下文的标识。

    Thread = Thread.CurrentPrincipal,它返回当前执行的 .NET 线程的主体,该线程位于 Win32 线程之上。

    它们会根据您的 IIS 配置而改变结果,如本文所述: http://msdn.microsoft.com/en-us/library/aa302377.aspx

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 2021-02-24
      • 2015-03-15
      • 2015-05-27
      • 1970-01-01
      • 2019-01-17
      • 2013-10-29
      • 1970-01-01
      相关资源
      最近更新 更多