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


606

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

Ответы:


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

96
Чем это отличается от Environment.UserName?
Сэм Харвелл

59
@SimonGillbee, это неправильно, Environment.UserNameвернет пользователя «RunAs».
Болу

5
Чтобы проверить .... MessageBox.Show(Environment.UserName);поместите это в ваше window_loadedсобытие и запустите с помощью RunAs ....
Bolu


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. Теперь, какая разница, спросите вы ... Я не уверен.
Gutblender

9
Мне нужно было, чтобы пользователь запустил приложение, а не вошел в систему (Environment.UserName не то, что я хочу), поэтому я сделал следующее, чтобы удалить домен: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thehelix

Вы должны добавить ToArray()после, Splitпрежде чем звонитьLast()
codenamezero

1
@codenamezero Нет ToArray()необходимости. Вам нужно было бы using System.Linq;хотя.
TheSoftwareJedi

112

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


5
Или,string userName = Environment.UserName;
Пончик

10
Предостережение: подобно тому, как Саймон Гиллби упоминал в комментариях к принятому ответу, Environment.UsernNameвыдает зарегистрированное имя учетной записи, но WindowsIdentity.GetCurrent().Nameвозвращает имя учетной записи, под которой работает приложение.
Гервальд

5
@leo: Внимание: эта информация также явно неверна, см . ответ Болу . :-)
TJ Crowder

НЕ используйте его с ASP.NET. docs.microsoft.com говорит: «Если приложение ASP.NET выполняется в среде разработки, свойство UserName возвращает имя текущего пользователя. В опубликованном приложении ASP.NET это свойство возвращает имя учетной записи пула приложений ( такой как Default AppPool). "
Feihoa

28

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

Свойство Environment.UserName

На той же странице написано:

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

А ТАКЖЕ

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

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


24

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

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(при запуске приложения на локальном сервере).


Какое пространство имен требуется для использования «запроса»?
TK-421

1
@ TK-421 Requestработает только если вы веб-приложение. Это примерSystem.Web.HttpRequest
Герардо Гриньоли


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

Похоже, вы хотели, чтобы имя пользователя пользователя отправляло запрос, я полагаю, контроллеру MVC или Web API. Это отличается от имени пользователя, под которым запущен процесс
Бен Ааронсон

@BenAaronson Вопрос ничего не говорит о том, какое имя пользователя запускает процесс. Мне нужно было имя пользователя, вошедшего в систему в данный момент, и поиск привел меня на эту страницу, этот код в итоге дал мне то, что мне было нужно.
Даниэль Э.


9

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


Спасибо, что поделились, см. Также: System.Windows.Forms.SystemInformation.UserDomainName
Ашиш Сингх,

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, где некоторые из них будут отображать имя учетной записи Windows на сервере, которая выполняет пул приложений ASP.Net. При запуске в качестве интерактивной программы или службы Windows, один из HttpContext будет недоступен, а один из других должен использоваться для поиска учетной записи, под которой выполняется процесс.
Оскар Берггрен

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

Предположим, будет ответ на C #
Шивам Бхарадвадж

4

попробуй это

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

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


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

Мой веб-сайт использует IIS, но когда я захожу на страницу с другого компьютера в сети, я вижу в качестве имени пользователя «Сетевая служба». Я перепробовал разные варианты, но это не дает мне войти в систему, кто просматривает страницу. Есть идеи?
Si8

1

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

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


Спасибо @doreen, вы нашли это полезным.
Шивам Бхарадвадж

0

Я просмотрел большинство ответов здесь, и ни один из них не дал мне правильное имя пользователя.

В моем случае я хотел получить имя пользователя, вошедшего в систему, при запуске моего приложения от другого пользователя, например, при нажатии Shift + щелчок правой кнопкой мыши на файле и «Запуск от имени другого пользователя».

Ответы, которые я попробовал, дали мне «другое» имя пользователя.

Эта запись блога предоставляет способ получения имени пользователя, вошедшего в систему, который работает даже в моем сценарии:
https://smbadiwe.github.io/post/track-activities-windows-service/

Это использует Wtsapi

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.