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


606

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

Answers:


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

96
与这有何不同Environment.UserName
山姆·哈威尔2009年

59
@SimonGillbee,这是错误的,Environment.UserName将返回“ RunAs”用户。
Bolu 2014年

5
为了验证.... MessageBox.Show(Environment.UserName);把这个在你的window_loaded事件,以及使用运行方式运行它....
波鲁


4
这返回Domain\Username。如何获得与用户名关联的名称?
SearchForKnowledge

325

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

Environment.UserName
- Will Display format : 'Username'

而不是

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

选择所需的格式。


7
您可以Environment.UserDomainName + "\\" + Environment.UserName用来获得与貌似相同的结果System.Security.Principal.WindowsIdentity.GetCurrent().Name。现在,有什么区别,你问...我不确定。
Gutblender14年

9
我需要让用户运行应用程序而不是登录用户(Environment.UserName不是我想要的),所以我执行了以下操作以剥离域: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thehelix

您需要在致电ToArray()后添加SplitLast()
codenamezero

1
@codenamezero不需要ToArray()。但是,您将需要using System.Linq;
TheSoftwareJedi,

112

尝试使用该属性:Environment.UserName


5
或者,string userName = Environment.UserName;
甜甜圈

10
注意:就像在已接受答案的注释中提到的Simon Gillbee一样,Environment.UsernName给出登录的帐户名,但WindowsIdentity.GetCurrent().Name返回的是应用程序运行所使用的帐户名。
Gerwald 2014年

5
@leo:警告:该信息显然也不正确,请参阅Bolu的回复。:-)
TJ Crowder 2015年

不要将其与ASP.NET一起使用。docs.microsoft.com说:“如果ASP.NET应用程序在开发环境中运行,则UserName属性将返回当前用户的名称。在已发布的ASP.NET应用程序中,此属性将返回应用程序池帐户的名称(例如Default AppPool)。”
feihoa

28

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

Environment.UserName属性

在同一页面上说:

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

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

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


24

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

String UserName = Request.LogonUserIdentity.Name;

上面的方法向我返回了用户名,格式为:DomainName \ UserName。例如,EUROPE \ UserName

不同于:

String UserName = Environment.UserName;

该格式显示:UserName

最后:

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

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


使用“请求”需要什么名称空间?
TK-421

1
@ TK-421 Request仅在您是Web应用程序时有效。这是System.Web.HttpRequest
Gerardo Grignoli


11

您可能还想尝试使用:

Environment.UserName;

像这样...:

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

希望这对您有所帮助。


11

我从现有答案中尝试了几种组合,但它们给了我

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

我最终使用

string vUserName = User.Identity.Name;

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


优秀的。我也只收到应用程序池标识。但是您的代码解决了我的问题。非常感谢。
SuryaKavitha 2014年

听起来您想要的是发出请求的用户名,我想是MVC或Web API控制器。这与进程运行的用户名不同
Ben Aaronson

@BenAaronson这个问题没有说明什么用户名正在运行一个进程。我需要当前登录的域用户名,搜索将我带到了此页面,该代码最终为我提供了所需的信息。
Daniel E.


9

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


感谢您的分享,另请参阅:System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh

9

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

这是请客:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

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


6

我尝试了所有以前的答案,但这些都不适合我,因此在MSDN上找到了答案。请参阅“ UserName4”以获取适合我的正确名称。

我使用的是登录用户,如下所示:

<asp:LoginName ID="LoginName1" runat="server" />

我写了一个小功能来尝试所有这些功能。我的结果是在每一行之后的评论中。

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;
}

调用此函数将通过返回返回已登录的用户名。

更新:我想指出的是,在本地服务器实例上运行此代码后,我看到Username4返回“”(空字符串),但是UserName3和UserName5返回登录的用户。只是要提防。


我的网站正在使用IIS,但是当我从网络中的另一台计算机访问该页面时,我始终看到“网络服务”作为用户名。我尝试了所有其他选项,但它没有给我查看页面的登录用户。任何的想法?
Si8

3
注意:尚不清楚,但是以上示例适用于在IIS中运行的Web应用程序的上下文,其中几个应用程序将显示执行ASP.Net应用程序池的服务器Windows帐户的名称。如果作为交互式程序或Windows服务运行,则HttpContext中的一个将不可用,而应使用另一个中的一个来查找执行该进程的帐户。
Oskar Berggren

4

这是代码(但不在C#中):

Private m_CurUser As String

Public ReadOnly Property CurrentUser As String
    Get
        If String.IsNullOrEmpty(m_CurUser) Then
            Dim who As System.Security.Principal.IIdentity = System.Security.Principal.WindowsIdentity.GetCurrent()

            If who Is Nothing Then
                m_CurUser = Environment.UserDomainName & "\" & Environment.UserName
            Else
                m_CurUser = who.Name
            End If
        End If
        Return m_CurUser
    End Get
End Property

这是代码(现在也在C#中):

private string m_CurUser;

public string CurrentUser
{
    get
    {
        if(string.IsNullOrEmpty(m_CurUser))
        {
            var who = System.Security.Principal.WindowsIdentity.GetCurrent();
            if (who == null)
                m_CurUser = System.Environment.UserDomainName + @"\" + System.Environment.UserName;
            else
                m_CurUser = who.Name;
        }
        return m_CurUser;
    }
}

假设
要用

4

尝试这个

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

现在看起来好多了


3

获取当前的Windows用户名:

using System;

class Sample
{
    public static void Main()
    {
        Console.WriteLine();

        //  <-- Keep this information secure! -->
        Console.WriteLine("UserName: {0}", Environment.UserName);
    }
}

我的网站正在使用IIS,但是当我从网络中的另一台计算机访问该页面时,我始终看到“网络服务”作为用户名。我尝试了所有其他选项,但它没有给我查看页面的登录用户。任何的想法?
Si8

2

对于要分发给多个用户的Windows Forms应用程序(其中许多通过vpn登录),我尝试了几种方法都可以用于本地计算机测试,而不能用于其他用户。我碰到了一篇我改编并可以工作的Microsoft文章。

using System;
using System.Security.Principal;

namespace ManageExclusion
{
    public static class UserIdentity

    {
        // concept borrowed from 
        // https://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity(v=vs.110).aspx

        public static string GetUser()
        {
            IntPtr accountToken = WindowsIdentity.GetCurrent().Token;
            WindowsIdentity windowsIdentity = new WindowsIdentity(accountToken);
            return windowsIdentity.Name;
        }
    }
}

1

如果它对其他人有帮助,当我将一个应用程序从c#.net 3.5应用程序升级到Visual Studio 2017时,此行代码User.Identity.Name.Substring(4);将引发此错误“ startIndex不能大于字符串的长度 ”(之前没有提示)。

当我将其更改为它时感到很高兴,System.Security.Principal.WindowsIdentity.GetCurrent().Name但是最终我还是使用它Environment.UserName;来获取登录的Windows用户并且没有域部分。


谢谢@doreen,您发现它很有用。
Shivam Bharadwaj,

0

我在这里查看了大多数答案,但没有一个给我正确的用户名。

就我而言,我想从其他用户运行我的应用程序时获得登录的用户名,例如当按住shift键并右键单击文件并“以其他用户身份运行”时。

我尝试的答案给了我“其他”用户名。

这篇博客文章提供了一种获取登录用户名的方法,即使在我的情况下也可以使用:https :
//smbadiwe.github.io/post/track-activities-windows-service/

它使用Wtsapi

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.