Wie erhalte ich den aktuellen Benutzernamen in .NET mit C #?


606

Wie erhalte ich den aktuellen Benutzernamen in .NET mit C #?

Antworten:


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

96
Wie ist das anders als Environment.UserName?
Sam Harwell

59
@SimonGillbee, dies ist falsch, Environment.UserNamegibt den Benutzer "RunAs" zurück.
Bolu

5
Um dies zu überprüfen , fügen Sie MessageBox.Show(Environment.UserName);dies in Ihre window_loadedVeranstaltung ein und führen Sie es mit RunAs aus.
Bolu


4
Dies kehrt zurück Domain\Username. Wie kann ich den mit dem Benutzernamen verknüpften Namen erhalten?
SearchForKnowledge

325

Wenn Sie sich in einem Netzwerk von Benutzern befinden, ist der Benutzername unterschiedlich:

Environment.UserName
- Will Display format : 'Username'

eher, als

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

Wählen Sie das gewünschte Format.


7
Sie können verwenden Environment.UserDomainName + "\\" + Environment.UserName, um scheinbar das gleiche Ergebnis wie zu erhalten System.Security.Principal.WindowsIdentity.GetCurrent().Name. Nun, was ist der Unterschied, fragst du ... Ich bin nicht sicher.
Gutblender

9
Ich musste den Benutzer dazu bringen, die App auszuführen, anstatt wer angemeldet ist (Environment.UserName ist nicht das, was ich will), also habe ich Folgendes getan, um die Domain zu System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
entfernen

Sie müssen hinzufügen , ToArray()nachdem Splitvor dem AufrufLast()
codenamezero

1
@codenamezero Nein ToArray()wird benötigt. Du würdest es aber brauchen using System.Linq;.
TheSoftwareJedi

112

Probieren Sie die Eigenschaft : Environment.UserName.


5
Oderstring userName = Environment.UserName;
Donut

10
Achtung: Wie Simon Gillbee in den Kommentaren der akzeptierten Antwort erwähnt, Environment.UsernNamegibt er den angemeldeten Kontonamen an, gibt jedoch den Kontonamen zurück WindowsIdentity.GetCurrent().Name, unter dem die Anwendung ausgeführt wird.
Gerwald

5
@leo: Achtung: Diese Information ist anscheinend auch falsch, siehe Bolus Antwort . :-)
TJ Crowder

Verwenden Sie es NICHT mit ASP.NET. docs.microsoft.com sagt: "Wenn eine ASP.NET-Anwendung in einer Entwicklungsumgebung ausgeführt wird, gibt die UserName-Eigenschaft den Namen des aktuellen Benutzers zurück. In einer veröffentlichten ASP.NET-Anwendung gibt diese Eigenschaft den Namen des Anwendungspoolkontos zurück ( wie Standard AppPool). "
Feihoa

28

Die Dokumentation für Environment.UserName scheint etwas widersprüchlich zu sein:

Environment.UserName-Eigenschaft

Auf derselben Seite steht:

Ruft den Benutzernamen der Person ab, die derzeit am Windows-Betriebssystem angemeldet ist.

UND

Zeigt den Benutzernamen der Person an, die den aktuellen Thread gestartet hat

Wenn Sie Environment.UserName mit RunAs testen, erhalten Sie den Namen des RunAs-Benutzerkontos und nicht den ursprünglich bei Windows angemeldeten Benutzer.


24

Ich stimme den anderen Antworten völlig zu, möchte aber noch eine Methode hervorheben, die besagt

String UserName = Request.LogonUserIdentity.Name;

Die obige Methode gab mir den Benutzernamen im Format zurück: DomainName \ UserName . Zum Beispiel EUROPE \ UserName

Welches unterscheidet sich von:

String UserName = Environment.UserName;

Welche im Format angezeigt: UserName

Und schlussendlich:

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

Dies ergab: NT AUTHORITY\IUSR(während die Anwendung auf einem IIS-Server ausgeführt wird) und DomainName\UserName(während die Anwendung auf einem lokalen Server ausgeführt wird).


Welcher Namespace ist erforderlich, um die "Anfrage" zu verwenden?
TK-421

1
@ TK-421 Requestfunktioniert nur, wenn Sie eine Webanwendung sind. Es ist eine Instanz vonSystem.Web.HttpRequest
Gerardo Grignoli

22

Verwenden:

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

Das ist der Anmeldename.


11

Möglicherweise möchten Sie auch Folgendes verwenden:

Environment.UserName;

So was...:

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

Hoffe das war hilfreich.


11

Ich habe verschiedene Kombinationen aus vorhandenen Antworten ausprobiert, aber sie gaben mir

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

Am Ende habe ich verwendet

string vUserName = User.Identity.Name;

Das gab mir nur den tatsächlichen Benutzernamen der Domain.


Ausgezeichnet. Ich habe auch nur die App-Pool-Identität erhalten. Aber Ihr Code hat mein Problem gelöst. Ich danke dir sehr.
SuryaKavitha

Es hört sich so an, als wollten Sie den Benutzernamen des Benutzers, der eine Anfrage stellt, an einen MVC- oder Web-API-Controller senden. Das unterscheidet sich von dem Benutzernamen, unter dem der Prozess ausgeführt wird
Ben Aaronson

@ BenAaronson Die Frage sagt nichts darüber aus, unter welchem ​​Benutzernamen ein Prozess ausgeführt wird. Ich brauchte den aktuell angemeldeten Domain-Benutzernamen und eine Suche brachte mich auf diese Seite. Dieser Code gab mir schließlich das, was ich brauchte.
Daniel E.

11
String myUserName = Environment.UserName

Dadurch erhalten Sie eine Ausgabe - Ihren_Benutzernamen


9

Verwenden Sie diese Option System.Windows.Forms.SystemInformation.UserNamefür den tatsächlich angemeldeten Benutzer, da Environment.UserNamedas vom aktuellen Prozess verwendete Konto weiterhin zurückgegeben wird.


Vielen Dank für das Teilen, siehe auch: System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh

9

Nur für den Fall, dass jemand wie ich nach dem Anzeigenamen des Benutzers im Gegensatz zum Benutzernamen sucht .

Hier ist der Leckerbissen:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

Fügen Sie System.DirectoryServices.AccountManagementin Ihrem Projekt einen Verweis auf hinzu .


6

Ich habe alle vorherigen Antworten ausprobiert und die Antwort auf MSDN gefunden, nachdem keine dieser Antworten für mich funktioniert hat. Siehe 'UserName4' für den richtigen für mich.

Ich bin hinter dem angemeldeten Benutzer her , wie angezeigt durch:

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

Hier ist eine kleine Funktion, die ich geschrieben habe, um sie alle auszuprobieren. Mein Ergebnis ist in den Kommentaren nach jeder Zeile.

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

Wenn Sie diese Funktion aufrufen, wird der angemeldete Benutzername zurückgegeben.

Update: Ich möchte darauf hinweisen, dass das Ausführen dieses Codes auf meiner lokalen Serverinstanz mir zeigt, dass Benutzername4 "" (eine leere Zeichenfolge) zurückgibt, Benutzername3 und Benutzername5 jedoch den angemeldeten Benutzer zurückgeben. Nur etwas, vor dem man sich hüten muss.


Meine Website verwendet IIS, aber wenn ich die Seite von einem anderen Computer im Netzwerk aus besuche, wird "Netzwerkdienst" weiterhin als Benutzername angezeigt. Ich habe alle verschiedenen Optionen ausprobiert, aber es gibt mir nicht den angemeldeten Benutzer, der die Seite anzeigt. Irgendeine Idee?
Si8

3
ANMERKUNG: Es wird nicht klargestellt, aber das obige Beispiel gilt im Kontext einer Webanwendung, die in IIS ausgeführt wird, wobei mehrere von ihnen den Namen des Server-Windows-Kontos anzeigen, das den ASP.Net-Anwendungspool ausführt. Wenn es als interaktives Programm oder Windows-Dienst ausgeführt wird, ist das von HttpContext nicht verfügbar, und eines der anderen sollte verwendet werden, um das Konto zu finden, unter dem der Prozess ausgeführt wird.
Oskar Berggren

4

Hier ist der Code (aber nicht in 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

Hier ist der Code (jetzt auch in 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;
    }
}

Angenommen, wir antworten in C #
Shivam Bharadwaj

4

Versuche dies

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

jetzt sieht es besser aus


2

Für eine Windows Forms-App, die an mehrere Benutzer verteilt werden sollte, von denen sich viele über VPN anmelden, hatte ich verschiedene Methoden ausprobiert, die alle für meine lokalen Maschinentests funktionierten, für andere jedoch nicht. Ich bin auf einen Microsoft-Artikel gestoßen, den ich angepasst habe und der funktioniert.

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

Holen Sie sich den aktuellen Windows-Benutzernamen:

using System;

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

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

Meine Website verwendet IIS, aber wenn ich die Seite von einem anderen Computer im Netzwerk aus besuche, wird "Netzwerkdienst" weiterhin als Benutzername angezeigt. Ich habe alle verschiedenen Optionen ausprobiert, aber es gibt mir nicht den angemeldeten Benutzer, der die Seite anzeigt. Irgendeine Idee?
Si8

1

Falls es für andere hilfreich ist, als ich eine App von der c # .net 3.5-App auf Visual Studio 2017 aktualisiert habe, hat diese Codezeile User.Identity.Name.Substring(4);den Fehler " startIndex kann nicht größer als die Länge der Zeichenfolge sein " ausgelöst (es wurde zuvor nicht gestört).

Es war glücklich, als ich es geändert habe, System.Security.Principal.WindowsIdentity.GetCurrent().Nameaber am Ende habe ich verwendet Environment.UserName;, um den angemeldeten Windows-Benutzer und ohne den Domain-Teil zu bekommen.


Danke @doreen, du fandest es nützlich.
Shivam Bharadwaj

0

Ich habe die meisten Antworten hier durchgesehen und keine hat mir den richtigen Benutzernamen gegeben.

In meinem Fall wollte ich den angemeldeten Benutzernamen erhalten, während ich meine App von einem anderen Benutzer aus ausführte, z. B. wenn Umschalt + Rechtsklick auf eine Datei und "Als anderer Benutzer ausführen".

Die Antworten, die ich versuchte, gaben mir den "anderen" Benutzernamen.

Dieser Blog-Beitrag bietet eine Möglichkeit, den angemeldeten Benutzernamen abzurufen, was auch in meinem Szenario funktioniert:
https://smbadiwe.github.io/post/track-activities-windows-service/

Es verwendet Wtsapi

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.