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

462

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

Теги:

16 ответов

708
Лучший ответ
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
  • 87
    Чем это отличается от Environment.UserName ?
  • 4
    это не будет работать в Windows 8, есть идеи, как?
Показать ещё 14 комментариев
265

Если вы находитесь в сети пользователей, то имя пользователя будет другим:

Environment.UserName
- Will Display format : 'Username'

а не

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

Выберите нужный формат.

  • 6
    Вы можете использовать Environment.UserDomainName + "\\" + Environment.UserName чтобы получить, по-видимому, тот же результат, что и System.Security.Principal.WindowsIdentity.GetCurrent().Name . Теперь, какая разница, спросите вы ... Я не уверен.
  • 9
    Мне нужно, чтобы пользователь запускал приложение, а не кто вошел в систему (Environment.UserName - не то, что мне нужно), поэтому я сделал следующее, чтобы удалить домен: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
Показать ещё 2 комментария
103

Попробуйте свойство: Environment.UserName.

  • 5
    Или string userName = Environment.UserName;
  • 8
    Предостережение: как Саймон Гиллби, упомянутый в комментариях к принятому ответу, Environment.UsernName дает имя зарегистрированной учетной записи, но WindowsIdentity.GetCurrent().Name возвращает имя учетной записи, под которой работает приложение.
Показать ещё 1 комментарий
24

Документация для Environment.UserName кажется немного противоречивой:

Свойство Environment.UserName

На той же странице говорится:

Получает имя пользователя, которое в настоящее время зарегистрировано в операционной системе Windows.

А ТАКЖЕ

отображает имя пользователя, который начал текущий поток

Если вы протестируете Environment.UserName с помощью RunAs, он предоставит вам имя учетной записи RunAs, а не пользователь, изначально войдивший в Windows.

21

Я полностью разделяю другие ответы, но я хотел бы выделить еще один метод, который говорит

String UserName = Request.LogonUserIdentity.Name;

Вышеуказанный метод вернул мне имя пользователя в формате: имя_домена\имя_пользователя. Например, EUROPE\UserName

Что отличается от:

String UserName = Environment.UserName;

Что отображается в формате: Имя пользователя

И наконец:

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

который дал: NT AUTHORITY\IUSR (при запуске приложения на сервере IIS) и DomainName\UserName (при запуске приложения на локальном сервере).

20

Использование:

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

Это будет имя входа.

  • 0
    Нет, если поток работает в повышенном режиме.
9

Я попробовал несколько комбинаций из существующих ответов, но они давали мне

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

В итоге я использовал

string vUserName = User.Identity.Name;

Это дало мне только фактическое имя пользователя домена.

  • 0
    Отлично. Я также получил только удостоверение пула приложений. Но твой код решил мою проблему. Огромное спасибо.
  • 0
    Похоже, вы хотели, чтобы имя пользователя пользователя отправляло запрос, я полагаю, на контроллер MVC или Web API. Это отличается от имени пользователя, под которым выполняется процесс
Показать ещё 1 комментарий
9

Вы также можете попробовать:

Environment.UserName;

Как это...:

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

Надеюсь, что это было полезно.

7

Используйте System.Windows.Forms.SystemInformation.UserName для фактически зарегистрированного пользователя, так как Environment.UserName все еще возвращает учетную запись, используемую текущим процессом.

  • 0
    Спасибо, что поделились, также смотрите: System.Windows.Forms.SystemInformation.UserDomainName
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 возвращают зарегистрированный пользователь. Просто остерегайтесь.

  • 0
    Мой веб-сайт использует IIS, но когда я захожу на страницу с другого компьютера в сети, я вижу в качестве имени пользователя «Сетевая служба». Я перепробовал разные варианты, но это не дает мне войти в систему, кто просматривает страницу. Любая идея?
  • 2
    ПРИМЕЧАНИЕ. Это неясно, но приведенный выше пример применяется в контексте веб-приложения, работающего в IIS, где некоторые из них будут отображать имя учетной записи Windows на сервере, которая выполняет пул приложений ASP.Net. При запуске в качестве интерактивной программы или службы Windows, один из HttpContext будет недоступен, а один из других должен использоваться для поиска учетной записи, под которой выполняется процесс.
4

Вот код (но не на С#):

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

Вот код (теперь также в С#):

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

попробуй это

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

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

2

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

Здесь лечить:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

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

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

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

using System;

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

        //  <-- Keep this information secure! -->
        Console.WriteLine("UserName: {0}", Environment.UserName);
    }
}
  • 0
    Мой веб-сайт использует IIS, но когда я захожу на страницу с другого компьютера в сети, я вижу в качестве имени пользователя «Сетевая служба». Я перепробовал разные варианты, но это не дает мне войти в систему, кто просматривает страницу. Любая идея?
0

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

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

  • 0
    Спасибо @doreen, вы нашли это полезным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню