Jak uzyskać bieżącą nazwę użytkownika w .NET przy użyciu C #?


606

Jak uzyskać bieżącą nazwę użytkownika w .NET przy użyciu C #?

Odpowiedzi:


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

96
Czym to się różni Environment.UserName?
— Sam Harwell,

59
@ SimonGillbee, to źle, Environment.UserNamezwróci użytkownika „RunAs”.
— Bolu

5
Aby zweryfikować ... MessageBox.Show(Environment.UserName);umieść to w swoim window_loadedzdarzeniu i uruchom za pomocą RunAs ....
— Bolu,


4
To zwraca Domain\Username. Jak mogę uzyskać nazwę powiązaną z nazwą użytkownika?
— SearchForKnowledge

325

Jeśli jesteś w sieci użytkowników, nazwa użytkownika będzie inna:

Environment.UserName
- Will Display format : 'Username'

zamiast

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

Wybierz żądany format.


7
Możesz użyć, Environment.UserDomainName + "\\" + Environment.UserNameaby uzyskać pozornie taki sam wynik jak System.Security.Principal.WindowsIdentity.GetCurrent().Name. Jaka jest różnica, pytasz ... Nie jestem pewien.
— Gutblender

9
Musiałem sprawić, aby użytkownik uruchomił aplikację, a nie kto jest zalogowany (Environment.UserName nie jest tym, czego chcę), więc wykonałem następujące czynności, aby usunąć domenę: System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
— thehelix

Musisz dodać ToArray()po, Splitzanim zadzwoniszLast()
— codenamezero

1
@codenamezero Nie ToArray()jest potrzebne. Potrzebujesz using System.Linq;jednak.
— TheSoftwareJedi

112

Spróbuj właściwość: Environment.UserName.


5
Lubstring userName = Environment.UserName;
— Donut

10
Uwaga: podobnie jak Simon Gillbee wspomniany w komentarzach do zaakceptowanej odpowiedzi, Environment.UsernNamepodaje nazwę zalogowanego konta, ale WindowsIdentity.GetCurrent().Namezwraca nazwę konta, pod którą działa aplikacja.
— Gerwald

5
@leo: Uwaga: Ta informacja jest również pozornie nieprawidłowa, patrz odpowiedź Bolu . :-)
— TJ Crowder

NIE używaj go z ASP.NET. docs.microsoft.com mówi: „Jeśli aplikacja ASP.NET działa w środowisku programistycznym, właściwość UserName zwraca nazwę bieżącego użytkownika. W opublikowanej aplikacji ASP.NET ta właściwość zwraca nazwę konta puli aplikacji ( takich jak Default AppPool). ”
— feihoa

28

Dokumentacja dla środowiska.UserName wydaje się być trochę sprzeczna:

Environment.UserName Właściwość

Na tej samej stronie jest napisane:

Pobiera nazwę użytkownika, który jest aktualnie zalogowany w systemie operacyjnym Windows.

I

wyświetla nazwę użytkownika, który rozpoczął bieżący wątek

Jeśli przetestujesz Environment.UserName przy użyciu RunAs, otrzymasz nazwę konta użytkownika RunAs, a nie użytkownika pierwotnie zalogowanego do systemu Windows.


24

Całkowicie popieram pozostałe odpowiedzi, ale chciałbym podkreślić jeszcze jedną metodę, która mówi

String UserName = Request.LogonUserIdentity.Name;

Powyższa metoda zwróciła mi nazwę użytkownika w formacie: nazwa_domeny \ nazwa_użytkownika . Na przykład EUROPE \ UserName

Który różni się od:

String UserName = Environment.UserName;

Które wyświetlane w formacie: nazwa użytkownika

I w końcu:

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

co dało: NT AUTHORITY\IUSR(podczas uruchamiania aplikacji na serwerze IIS) i DomainName\UserName(podczas uruchamiania aplikacji na serwerze lokalnym).


Jaka przestrzeń nazw jest wymagana do korzystania z „Żądania”.
— TK-421,

1
@ TK-421 Requestdziała tylko wtedy, gdy jesteś aplikacją internetową. Jest to przykładSystem.Web.HttpRequest
— Gerardo Grignoli

22

Posługiwać się:

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

To będzie nazwa logowania.


11

Możesz także spróbować użyć:

Environment.UserName;

Lubię to...:

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

Mam nadzieję, że to było pomocne.


11

Próbowałem kilku kombinacji z istniejących odpowiedzi, ale one mi dawały

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

Skończyło się na tym

string vUserName = User.Identity.Name;

Co dało mi rzeczywistą nazwę użytkownika domeny tylko dla użytkowników.


Świetny. Otrzymałem również tylko tożsamość puli aplikacji. Ale twój kod rozwiązał mój problem. Dziękuję bardzo.
— SuryaKavitha

Wygląda na to, że chciałeś podać nazwę użytkownika, który wysłał zapytanie, do kontrolera MVC lub Web API. Różni się to od nazwy użytkownika, pod którym działa proces
— Ben Aaronson

@BenAaronson Pytanie nie mówi nic o tym, jaka nazwa użytkownika uruchamia proces. Potrzebowałem aktualnie zalogowanej nazwy użytkownika domeny i wyszukiwanie doprowadziło mnie do tej strony, kod ten dał mi to, czego potrzebowałem.
— Daniel E.


9

Użyj System.Windows.Forms.SystemInformation.UserNamedla faktycznie zalogowanego użytkownika, ponieważ Environment.UserNamenadal zwraca konto używane przez bieżący proces.


Dziękujemy za udostępnienie, zobacz także: System.Windows.Forms.SystemInformation.UserDomainName
— Ashish Singh

9

Na wypadek, gdyby ktoś szukał nazwy wyświetlanej użytkownika w przeciwieństwie do nazwy użytkownika , takiej jak ja.

Oto uczta:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

Dodaj odniesienie do System.DirectoryServices.AccountManagement w swoim projekcie.


6

Wypróbowałem wszystkie poprzednie odpowiedzi i znalazłem odpowiedź na MSDN po tym, jak żadna z nich nie działała dla mnie. Zobacz „UserName4” dla właściwego dla mnie.

Jestem za Zalogowanym użytkownikiem , co pokazuje:

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

Oto mała funkcja, którą napisałem, aby wypróbować je wszystkie. Mój wynik znajduje się w komentarzach po każdym wierszu.

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

Wywołanie tej funkcji powoduje zwrócenie zalogowanej nazwy użytkownika.

Aktualizacja: Chciałbym podkreślić, że uruchomienie tego kodu na mojej instancji serwera lokalnego pokazuje, że nazwa_użytkownika4 zwraca „” (pusty ciąg znaków), ale nazwa_użytkownika3 i nazwa_użytkownika5 zwraca zalogowanego użytkownika. Tylko coś, czego należy się wystrzegać.


Moja witryna korzysta z IIS, ale kiedy odwiedzam stronę z innego komputera w sieci, nadal widzę „Usługa sieciowa” jako nazwę użytkownika. Próbowałem różnych opcji, ale nie daje mi zalogowanego użytkownika, który przegląda stronę. Dowolny pomysł?
— Si8

3
UWAGA: Nie jest to wyjaśnione, ale powyższy przykład ma zastosowanie w kontekście aplikacji sieci Web działającej w IIS, gdzie kilka z nich wyświetla nazwę konta Windows serwera, które wykonuje pulę aplikacji ASP.Net. Jeśli działa jako program interaktywny lub usługa Windows, ta z HttpContext będzie niedostępna, a jedna z pozostałych powinna zostać użyta do znalezienia konta, na którym wykonywany jest proces.
— Oskar Berggren

4

Oto kod (ale nie w 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

Oto kod (teraz również w 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;
    }
}

Załóżmy, że będzie odpowiedź w C #
— Shivam Bharadwaj

4

Spróbuj tego

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

teraz wygląda lepiej


3

Uzyskaj aktualną nazwę użytkownika systemu Windows:

using System;

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

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

Moja witryna korzysta z IIS, ale kiedy odwiedzam stronę z innego komputera w sieci, nadal widzę „Usługa sieciowa” jako nazwę użytkownika. Próbowałem różnych opcji, ale nie daje mi zalogowanego użytkownika, który przegląda stronę. Dowolny pomysł?
— Si8

2

W przypadku aplikacji Windows Forms, która miała być dystrybuowana do kilku użytkowników, z których wielu loguje się przez VPN, wypróbowałem kilka sposobów, które wszystkie działały na potrzeby testowania mojej maszyny lokalnej, ale nie na innych. Natknąłem się na artykuł Microsoftu, który dostosowałem i działam.

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

W przypadku, gdy jest to pomocne dla innych, kiedy zaktualizowałem aplikację z c # .net 3.5 do Visual Studio 2017, ten wiersz kodu User.Identity.Name.Substring(4);wyrzucił błąd „ startIndex nie może być większy niż długość ciągu ” (wcześniej nie baulk).

Byłem szczęśliwy, kiedy go zmieniłem na, System.Security.Principal.WindowsIdentity.GetCurrent().Namejednak skończyło się Environment.UserName;na tym, że zalogowałem się w systemie Windows bez części domeny.


Dzięki @doreen uznałeś to za przydatne.
— Shivam Bharadwaj

0

Przejrzałem większość odpowiedzi tutaj i żadna z nich nie dała mi właściwej nazwy użytkownika.

W moim przypadku chciałem uzyskać zalogowaną nazwę użytkownika podczas uruchamiania aplikacji od innego użytkownika, na przykład gdy Shift + kliknij prawym przyciskiem myszy plik i „Uruchom jako inny użytkownik”.

Odpowiedzi, które wypróbowałem, dały mi „inną” nazwę użytkownika.

Ten post na blogu zawiera sposób na uzyskanie zalogowanej nazwy użytkownika, co działa nawet w moim scenariuszu:
https://smbadiwe.github.io/post/track-activities-windows-service/

Używa Wtsapi

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.