Як отримати поточне ім'я користувача у .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 ....
Болу,


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. Тепер, яка різниця, ви запитаєте ... Я не впевнений.
Гутблендер

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 ця властивість повертає ім'я облікового запису пулу додатків ( наприклад, AppPool за замовчуванням). "
feihoa

28

Документація для Environment.UserName здається дещо суперечливою:

Environment.UserName Properties

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

Отримує ім’я користувача особи, яка зараз увійшла в операційну систему Windows.

І

відображає ім'я користувача людини, яка розпочала поточну нитку

Якщо ви протестуєте Environment.UserName за допомогою RunAs, він дасть вам ім'я облікового запису користувача RunAs, а не той користувач, який спочатку увійшов у Windows.


24

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

String UserName = Request.LogonUserIdentity.Name;

Вищеописаний метод повернув мені ім’я користувача у форматі: DomainName \ UserName . Наприклад, EUROPE \ UserName

Що відрізняється від:

String UserName = Environment.UserName;

Який відображається у форматі: 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
Ashish Singh

9

Тільки в разі , якщо хто - то шукає користувач Display Name , на відміну від імені користувача , як я.

Ось частування:

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 Server, який виконує пул додатків 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 #
Shivam

4

спробуйте це

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

тепер це виглядає краще


3

Отримайте поточне ім’я користувача Windows:

using System;

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

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

Мій веб-сайт використовує IIS, але коли я відвідую сторінку з іншого комп'ютера в мережі, я постійно бачу "Мережевий сервіс" як ім'я користувача. Я спробував усі різні варіанти, але це не дає мені зареєструватися користувачеві, який переглядає сторінку. Будь-яка ідея?
Si8

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

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

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


Дякую @doreen, ти вважаєш це корисним.
Шивам Бхарадвай

0

Я переглянув більшість відповідей тут, і жодна з них не дала мені правильного імені користувача.

У моєму випадку я хотів отримати ім’я користувача, який увійшов під час роботи свого додатка від іншого користувача, як, наприклад, при зміні + клацання правою кнопкою миші на файлі та "Запустити як інший користувач".

Відповіді, які я спробував, дали мені "інше" ім'я користувача.

Ця публікація в блозі пропонує спосіб отримати ім’я користувача, який увійшов, що працює навіть у моєму сценарії:
https://smbadiwe.github.io/post/track-activities-windows-service/

Тут використовується Wtsapi

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.