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.