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

时间:2009-08-06 17:40:28

标签: c# .net

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

18 个答案:

答案 0 :(得分:798)

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

答案 1 :(得分:287)

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

Environment.UserName
- Will Display format : 'Username'

而不是

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

选择所需的格式。

答案 2 :(得分:108)

尝试使用该属性:Environment.UserName

答案 3 :(得分:25)

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

Environment.UserName Property

在同一页面上说:

  

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

  

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

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

答案 4 :(得分:23)

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

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(在本地服务器上运行应用程序时)。

答案 5 :(得分:21)

使用:

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

这将是登录名。

答案 6 :(得分:11)

您可能还想尝试使用:

Environment.UserName;

像这样......:

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

希望这有用。

答案 7 :(得分:9)

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

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

我最终使用

string vUserName = User.Identity.Name;

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

答案 8 :(得分:7)

对实际登录的用户使用System.Windows.Forms.SystemInformation.UserNameEnvironment.UserName仍会返回当前进程使用的帐户。

答案 9 :(得分:5)

我已经尝试了所有以前的答案,并在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返回登录用户。只是需要注意的事情。

答案 10 :(得分:4)

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

这是一种享受:

  

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

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

答案 11 :(得分:4)

String myUserName = Environment.UserName

这将为您提供输出-您的用户名

答案 12 :(得分:3)

这是代码(但不是在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;
    }
}

答案 13 :(得分:3)

试试这个

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

现在看起来更好

答案 14 :(得分:2)

对于要分发给多个用户的Windows窗体应用程序,其中许多用户通过vpn登录,我尝试了几种方法,这些方法都适用于本地机器测试,但不适用于其他用户。我遇到了一篇微软的文章,我改编并运用。

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

答案 15 :(得分:1)

获取当前的Windows用户名:

using System;

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

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

答案 16 :(得分:1)

如果对其他人有帮助,当我从c#.net 3.5应用程序升级到Visual Studio 2017时,此行代码User.Identity.Name.Substring(4);抛出此错误“ startIndex不能大于字符串的长度< / em>”(以前没偷过)。

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

答案 17 :(得分:0)

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

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

我尝试的答案为我提供了“其他”用户名。

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

它使用Wtsapi