如何使用不同的方法获取Windows用户名?

38

.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
1
@marc_s:已添加您的建议。 - Andy
4个回答

32

Environment.UserName 调用 advapi32.dll 中的 GetUserName。这意味着如果你正在模拟另一个用户,这个属性将反映出来。

Thread.CurrentPrincipal 有一个 setter 并且可以通过编程方式更改。(顺便说一下,这不是模拟身份。)

WindowsIdentity 是当前的 windows 身份(如果有)。它不一定反映出用户信息,比如 ASP.NET 使用 FormsAuthentication。在这种情况下,WindowsIdentity 将是 NT-service,而 FormsIdentity 将是已登录的用户。还有 PassportIdentity,你也可以构建自己的组件来进一步复杂化事情。


“impersonation” 的意思是,如果你通过“以其他身份运行”来运行某些东西,是吗? - Andy
@Andy,我还没有尝试过那个。但是WindowsIdentity类有一个Impersonate()方法,我很确定它可以进行模拟。 ;) - sisve

1

你询问了替代的方法。

当然,你总是可以使用本地的Windows API:GetUserName


0

我相信该属性被放置在多个位置,以便程序员更容易找到。只有一个登录用户和一个相应的名称。


那么,这意味着所有这些方法都是可互换的吗? - Andy
我相信是的。我不会期望有任何微小的差异。 - Pavel Radzivilovsky

0
以下是三种方法的描述:
HttpContext = HttpContext.Current.User,返回一个包含当前Web请求的安全信息的IPrincipal对象。这是已验证的Web客户端。
WindowsIdentity = WindowsIdentity.GetCurrent(),返回当前执行的Win32线程的安全上下文的标识。
Thread = Thread.CurrentPrincipal,返回正在执行的.NET线程的主体,该线程在Win32线程之上运行。
它们的结果会根据您的IIS配置而改变,如本文所述: http://msdn.microsoft.com/en-us/library/aa302377.aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接