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

Yve*_*ves 577 .net c#

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

jua*_*uan 846

string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Run Code Online (Sandbox Code Playgroud)

  • 这与`Environment.UserName`有什么不同? (95认同)
  • @SimonGillbee,这是错误的,`Environment.UserName`将返回"RunAs"用户. (54认同)
  • 要验证....`MessageBox.Show(Environment.UserName);`把它放在你的`window_loaded`事件中,并使用RunAs运行它.... (5认同)
  • [讨论META](http://meta.stackexchange.com/questions/228096/misleading-comments-with-high-volume-of-upvotes) (5认同)
  • 这在Windows 8中不起作用,任何想法如何? (4认同)
  • 这将返回`Domain\Username`.如何获取与用户名关联的名称? (3认同)
  • @SearchForKnowledge我只使用`Split()`来提取用户名:`string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\')[1];` (2认同)

Isr*_*ies 308

如果您在用户网络中,则用户名将不同:

Environment.UserName
- Will Display format : 'Username'
Run Code Online (Sandbox Code Playgroud)

而不是

System.Security.Principal.WindowsIdentity.GetCurrent().Name
- Will Display format : 'NetworkName\Username'
Run Code Online (Sandbox Code Playgroud)

选择所需的格式.

  • 我需要让用户运行应用程序而不是谁登录(Environment.UserName不是我想要的),所以我做了以下操作来剥离域:`System.Security.Principal.WindowsIdentity.GetCurrent() .Name.Split('\\').Last();` (9认同)
  • 您可以使用`Environment.UserDomainName +"\\"+ Environment.UserName`来获得与`System.Security.Principal.WindowsIdentity.GetCurrent().Name`看似相同的结果.现在,有什么区别,你问......我不确定. (7认同)
  • 或者不使用 Linq:`System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' )[1];`。 (2认同)

Jar*_*Par 109

试试这个房产:Environment.UserName.

  • 注意:就像Simon Gillbee在接受的答案的评论中提到的那样,`Environment.UsernName`给出了登录的帐户名,但是`WindowsIdentity.GetCurrent().Name`返回了运行应用程序的帐户名. (9认同)
  • 或者,`string userName = Environment.UserName;` (5认同)
  • @leo:警告:该信息显然也不正确,请参阅[Bolu的回复](http://stackoverflow.com/questions/1240373/how-do-i-get-the-current-username-in-net-using- C#comment34794502_1240379).:-) (5认同)
  • 不要将其与 ASP.NET 一起使用。learn.microsoft.com 说:“如果 ASP.NET 应用程序在开发环境中运行,则 UserName 属性返回当前用户的名称。在已发布的 ASP.NET 应用程序中,此属性返回应用程序池帐户的名称(例如默认应用程序池)。” (2认同)

小智 27

Environment.UserName的文档似乎有点冲突:

Environment.UserName属性

它在同一页面上说:

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

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

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


Shi*_*657 24

我完全赞同其他答案,但我想强调另一种方法

String UserName = Request.LogonUserIdentity.Name;
Run Code Online (Sandbox Code Playgroud)

上面的方法返回了以下格式的用户名:DomainName\UserName.例如,EUROPE\UserName

这与以下内容不同:

String UserName = Environment.UserName;
Run Code Online (Sandbox Code Playgroud)

其中显示的格式为:UserName

最后:

String UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Run Code Online (Sandbox Code Playgroud)

它给出了:( NT AUTHORITY\IUSR在IIS服务器上运行应用程序时)和DomainName\UserName(在本地服务器上运行应用程序时).

  • @TK-421 `Request` 仅当您是 Web 应用程序时才有效。它是 `System.Web.HttpRequest` 的一个实例 (3认同)

小智 21

使用:

System.Security.Principal.WindowsIdentity.GetCurrent().Name
Run Code Online (Sandbox Code Playgroud)

那将是登录名.


jay*_*t55 11

您可能还想尝试使用:

Environment.UserName;
Run Code Online (Sandbox Code Playgroud)

像这样...:

string j = "Your WindowsXP Account Name is: " + Environment.UserName;
Run Code Online (Sandbox Code Playgroud)

希望这有帮助.


Dan*_* E. 10

我尝试了现有答案中的几种组合,但是他们给了我

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool
Run Code Online (Sandbox Code Playgroud)

我最终使用了

string vUserName = User.Identity.Name;
Run Code Online (Sandbox Code Playgroud)

这给了我实际的用户域名用户名.


小智 9

使用System.Windows.Forms.SystemInformation.UserName在用户实际记录为 Environment.UserName仍返回正在使用的当前进程的帐户.


Shi*_*waj 8

String myUserName = Environment.UserName
Run Code Online (Sandbox Code Playgroud)

这将为您提供输出-your_user_name


Fla*_*rev 5

我已经尝试了所有以前的答案,并在MSDN上找到答案,因为这些都不适用于我.请参阅'UserName4'以获取正确的信息.

我在登录用户之后,如下所示:

<asp:LoginName ID="LoginName1" runat="server" />
Run Code Online (Sandbox Code Playgroud)

这是我写的一个小功能来尝试它们.我的结果是在每行之后的注释中.

protected string GetLoggedInUsername()
{
    string UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; // Gives NT AUTHORITY\SYSTEM
    String UserName2 = Request.LogonUserIdentity.Name; // Gives NT AUTHORITY\SYSTEM
    String UserName3 = Environment.UserName; // Gives SYSTEM
    string UserName4 = HttpContext.Current.User.Identity.Name; // Gives actual user logged on (as seen in <ASP:Login />)
    string UserName5 = System.Windows.Forms.SystemInformation.UserName; // Gives SYSTEM
    return UserName4;
}
Run Code Online (Sandbox Code Playgroud)

调用此函数将返回登录的用户名.

更新:我想指出在我的本地服务器实例上运行此代码向我显示Username4返回""(空字符串),但UserName3和UserName5返回登录用户.只是需要注意的事情.

  • 注意:它没有说清楚,但上面的示例适用于在IIS中运行的Web应用程序的上下文,其中几个将显示执行ASP.Net应用程序池的服务器Windows帐户的名称.如果作为交互式程序或Windows服务运行,那么来自HttpContext的那个将不可用,并且应该使用其中一个来查找进程执行的帐户. (3认同)

小智 5

尝试这个

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];
Run Code Online (Sandbox Code Playgroud)

现在看起来好多了


Bhr*_*mar 5

以防万一有人像我一样在寻找用户显示名而不是用户名

这是请客:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

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