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

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

599 .netc#
6.08.2009 17:40:27
18 ОТВЕТОВ
РЕШЕНИЕ
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
887
6.08.2009 17:41:07
Чем это отличается от Environment.UserName?
Sam Harwell 6.08.2009 17:44:23
@SimonGillbee, это неправильно, Environment.UserNameвернет пользователя «RunAs».
Bolu 2.04.2014 14:45:05
Чтобы проверить .... MessageBox.Show(Environment.UserName);поместите это в ваше window_loadedсобытие и запустите с помощью RunAs ....
Bolu 2.04.2014 17:05:42
Bolu 3.07.2014 08:18:28
Это возвращается Domain\Username. Как я могу получить имя, связанное с именем пользователя?
SearchForKnowledge 25.06.2015 15:23:40

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

111
3.07.2012 17:39:44
Или,string userName = Environment.UserName;
Donut 7.08.2009 18:02:14
Предостережение: как Саймон Гиллби, упомянутый в комментариях к принятому ответу, Environment.UsernNameвыдает имя зарегистрированной учетной записи, но WindowsIdentity.GetCurrent().Nameвозвращает имя учетной записи, под которой работает приложение.
Gerwald 14.10.2014 16:00:29
@leo: Внимание: эта информация также явно неверна, см . ответ Болу . :-)
T.J. Crowder 5.11.2015 16:56:33
НЕ используйте его с ASP.NET. docs.microsoft.com говорит: «Если приложение ASP.NET выполняется в среде разработки, свойство UserName возвращает имя текущего пользователя. В опубликованном приложении ASP.NET это свойство возвращает имя учетной записи пула приложений ( такой как Default AppPool). "
feihoa 22.10.2019 10:56:19

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

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

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

21
24.05.2016 11:48:51

Вы также можете попробовать использовать:

Environment.UserName;

Нравится...:

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

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

11
7.08.2009 17:58:53

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

Environment.UserName
- Will Display format : 'Username'

скорее, чем

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

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

325
14.01.2016 18:10:26
Вы можете использовать, Environment.UserDomainName + "\\" + Environment.UserNameчтобы получить, казалось бы, тот же результат, что и System.Security.Principal.WindowsIdentity.GetCurrent().Name. Теперь, какая разница, спросите вы ... Я не уверен.
Gutblender 6.10.2014 16:06:02
Мне нужно, чтобы пользователь запускал приложение, а не кто вошел в систему (Environment.UserName - не то, что мне нужно), поэтому я сделал следующее, чтобы удалить домен: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thehelix 21.01.2015 20:54:44
Вы должны добавить ToArray()после, Splitпрежде чем звонитьLast()
codenamezero 17.11.2017 16:28:17
@codenamezero Нет ToArray()необходимости. Вам нужно было бы using System.Linq;хотя.
TheSoftwareJedi 3.01.2019 15:50:57

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

Свойство Environment.UserName

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

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

А ТАКЖЕ

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

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

28
24.05.2016 11:52:05

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

9
26.01.2014 05:17:55
Спасибо, что поделились, см. Также: System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh 16.02.2017 13:49:24

Вот код (но не в 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
20.02.2016 20:40:12
Предположим, что ответ в C #
Shivam Bharadwaj 15.05.2019 10:16:43

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

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

Я в конечном итоге с помощью

string vUserName = User.Identity.Name;

Который дал мне фактическое имя пользователя домена только для пользователя.

11
28.05.2014 16:59:20
Отлично. Я также получил только удостоверение пула приложений. Но твой код решил мою проблему. Огромное спасибо.
SuryaKavitha 30.10.2014 11:47:19
Похоже, вы хотели, чтобы имя пользователя пользователя отправляло запрос, я полагаю, контроллеру MVC или Web API. Это отличается от имени пользователя, под которым запущен процесс
Ben Aaronson 30.03.2016 08:30:33
@BenAaronson Вопрос ничего не говорит о том, какое имя пользователя запускает процесс. Мне нужно было имя пользователя, вошедшего в систему в данный момент, и поиск привел меня на эту страницу, этот код в итоге дал мне то, что мне было нужно.
Daniel E. 28.04.2016 12:53:57

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

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

24
14.01.2016 18:21:46
Какое пространство имен требуется для использования «запроса»?
TK-421 30.09.2019 08:25:29
@ TK-421 Requestработает только если вы веб-приложение. Это примерSystem.Web.HttpRequest
Gerardo Grignoli 26.02.2020 12:44:16

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

using System;

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

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

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

6
25.05.2016 16:38:54
Мой веб-сайт использует IIS, но когда я захожу на страницу с другого компьютера в сети, я вижу в качестве имени пользователя «Сетевая служба». Я перепробовал разные варианты, но это не дает мне войти в систему, кто просматривает страницу. Есть идеи?
Si8 8.08.2016 16:53:27
ПРИМЕЧАНИЕ. Это неясно, но приведенный выше пример применяется в контексте веб-приложения, работающего в IIS, где некоторые из них будут отображать имя учетной записи Windows на сервере, которая выполняет пул приложений ASP.Net. При запуске в качестве интерактивной программы или службы Windows, один из HttpContext будет недоступен, а один из других должен использоваться для поиска учетной записи, под которой выполняется процесс.
Oskar Berggren 6.06.2017 13:54:26

Для приложения 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;
        }
    }
}
2
6.06.2017 13:46:24

попробуй это

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

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

4
18.01.2018 14:22:20

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

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

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

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

8
9.02.2018 11:19:55

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

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

1
9.08.2018 18:45:31
Спасибо @doreen, вы нашли это полезным.
Shivam Bharadwaj 20.02.2019 11:55:27
String myUserName = Environment.UserName

Это даст вам вывод - your_user_name

10
27.06.2019 15:03:51

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

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

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

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

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

0
31.03.2020 13:45:18