Как получить текущее имя пользователя в .NET с помощью C #? - PullRequest
538 голосов
/ 06 августа 2009

Как мне получить текущее имя пользователя в .NET с помощью C #?

Ответы [ 17 ]

5 голосов
/ 23 мая 2016

Я перепробовал все предыдущие ответы и нашел ответ на MSDN после того, как ни один из них не помог мне.См. 'UserName4' для меня.

Я за Зарегистрированный пользователь , как показано:

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

Вот небольшая функция Iнаписал, чтобы попробовать их всех.Мой результат в комментариях после каждой строки.

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 возвращают зарегистрированного пользователя.Просто о чем-то опасаться.

4 голосов
/ 09 февраля 2018

На всякий случай, если кто-то ищет пользователя Отображаемое имя вместо Имя пользователя , как я.

Вот угощение:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

Добавить ссылку на System.DirectoryServices.AccountManagement в ваш проект.

3 голосов
/ 18 января 2018

попробуйте

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

теперь выглядит лучше

3 голосов
/ 15 мая 2014

Вот код (но не в 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;
    }
}
2 голосов
/ 24 января 2017

Для приложения 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 голос
/ 09 августа 2018

В случае, если это полезно для других, когда я обновил приложение из приложения c # .net 3.5 до Visual Studio 2017, эта строка кода User.Identity.Name.Substring(4); вызвала эту ошибку " startIndex не может быть больше длины строки"(это не смущало прежде).

Было приятно, когда я изменил его на System.Security.Principal.WindowsIdentity.GetCurrent().Name, но в итоге я использовал Environment.UserName;, чтобы получить зарегистрированного пользователя Windows и без доменной части.

1 голос
/ 11 мая 2016

Получить текущее имя пользователя Windows:

using System;

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

        //  <-- Keep this information secure! -->
        Console.WriteLine("UserName: {0}", Environment.UserName);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...