如何使用C#在.NET中获取当前用户名?

724

如何使用C#在.NET中获取当前用户名?


在模拟上下文中,用户名可以与已登录用户会话的用户名不同(例如在托管代码中使用 runas 或 .Net 模拟),请参见其他人的评论。 - DukeDidntNukeEm
18个回答

1048
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

113
这和 Environment.UserName 有什么不同? - Sam Harwell
64
@SimonGillbee,这是错误的,“Environment.UserName”将返回“RunAs”用户。 - Bolu
6
еңЁдҪ зҡ„window_loadedдәӢ件дёӯеҠ е…ҘMessageBox.Show(Environment.UserName);пјҢ然еҗҺдҪҝз”ЁRunAsиҝҗиЎҢжқҘйӘҢиҜҒгҖӮ - Bolu
6
讨论META上的问题:http://meta.stackexchange.com/questions/228096/misleading-comments-with-high-volume-of-upvotes - Bolu
9
这会返回 域\用户名。我该如何获得与该用户名相关联的名称? - SearchForKnowledge
显示剩余10条评论

379
如果您处于用户网络中,则用户名将会不同:
Environment.UserName
- Will Display format : 'Username'

而不是

System.Security.Principal.WindowsIdentity.GetCurrent().Name
- Will Display format : 'NetworkName\Username'

请选择您想要的格式。


10
您可以使用Environment.UserDomainName + "\\" + Environment.UserName来获取与System.Security.Principal.WindowsIdentity.GetCurrent().Name看起来相同的结果。现在,您可能会问有什么区别...我不太确定。 - Gutblender
13
为了获取运行应用程序的用户而不是已登录的用户(Environment.UserName 不符合我的要求),我采用以下方法剥离域名: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\').Last(); - thehelix
1
@codenamezero 不需要使用 ToArray()。但是你需要使用 using System.Linq; - TheSoftwareJedi
2
如果不使用Linq:System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\')[1]; - Mike Lowery
这是两个完全不同的东西。WindowsIdentity.GetCurrent()将返回运行进程的用户。Environment.UserName可能会返回已登录的用户(但由于某些原因它并不总是这样)。 - Cesar
显示剩余3条评论

124

5
或者,string userName = Environment.UserName;,其中 Environment.UserName 表示当前用户的用户名。 - Donut
13
注意:就像Simon Gillbee在已接受答案的评论中提到的那样,Environment.UserName返回登录账户名,但是WindowsIdentity.GetCurrent().Name返回应用程序运行的账户名。 - Gerwald
5
注意:该信息显然也是不正确的,请参见Bolu的回复。 :-) - T.J. Crowder
2
learn.microsoft.com表示:“如果ASP.NET应用程序在开发环境中运行,则UserName属性返回当前用户的名称。在已发布的ASP.NET应用程序中,此属性返回应用程序池帐户的名称(例如Default AppPool)。” - feihoa
@feihoa MS Word表达得不太准确,让人误以为该属性在不同的环境中会有不同的功能。实际上并非如此。他们应该更清楚地说明该属性(始终)返回执行服务器端进程的用户,也就是在服务器上在任务管理器中可见的用户。 - Oskar Berggren

35

环境.UserName的文档似乎有点矛盾:

Environment.UserName 属性

在同一页上,它说:

获取当前登录到Windows操作系统的用户的用户名。

显示启动当前线程的人的用户名。

如果您使用RunAs测试Environment.UserName,它将为您提供RunAs用户帐户名称,而不是最初登录到Windows的用户。


25

我完全同意其他回答,但我想强调另一种方法,即

String UserName = Request.LogonUserIdentity.Name;
上述方法以以下格式返回用户名:DomainName\UserName,例如 EUROPE\UserName。
这与以下内容不同:
String UserName = Environment.UserName;

显示格式为:用户名

最后:

String UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

这个问题在运行应用程序时会显示:NT AUTHORITY\IUSR(在IIS服务器上运行应用程序时)和DomainName\UserName(在本地服务器上运行应用程序时)。


使用“Request.”需要哪个命名空间? - TK-421
3
@TK-421 Request 只有在你是一个 Web 应用程序时才能工作。它是 System.Web.HttpRequest 的一个实例。 - Gerardo Grignoli
@GerardoGrignoli - 感谢您的评论,是的,如果您正在使用Web应用程序,请求(Request)才能起作用。 - Shivam657
任何只是向您提供类型名称而没有提到至少命名空间(更不用说程序集的完整名称)的答案都应该被降低分数。 不幸的是,如果我们这样做,我们将不得不对所有C#答案进行99%的降级。 哦人类。 - Mike Nakis

23

使用:

System.Security.Principal.WindowsIdentity.GetCurrent().Name

那将是登录名。


16
String myUserName = Environment.UserName

这将给您输出 - 您的用户名


重复的问题:https://dev59.com/WXM_5IYBdhLWcg3ww2EQ#1240379 - Jim G.

16

如果有人像我一样在寻找与用户名相对应的用户显示名称,以下是相关内容:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

在您的项目中添加对System.DirectoryServices.AccountManagement的引用。


12

你可能还想尝试使用以下方法:

Environment.UserName;

像这样...:

string j = "Your WindowsXP Account Name is: " + Environment.UserName;

希望这对您有所帮助。


12

我尝试了几种现有答案的组合,但它们都没有成功。

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

我最终使用了

string vUserName = User.Identity.Name;

这使我只获取到实际用户的域用户名。


太好了。我也只收到了应用程序池身份。但是你的代码解决了我的问题。非常感谢你。 - SuryaKavitha
1
听起来你想要请求的用户的用户名,我猜是针对MVC或Web API控制器。这与进程正在运行的用户名不同。 - Ben Aaronson
@BenAaronson 这个问题并没有说明正在运行进程的用户名是什么。我需要当前登录的域用户名,搜索带我来到了这个页面,这段代码最终给了我我所需的内容。 - Daniel E.

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