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;.
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:
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.
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).
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
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.
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.
protectedstringGetLoggedInUsername(){stringUserName=System.Security.Principal.WindowsIdentity.GetCurrent().Name;// Gives NT AUTHORITY\SYSTEMStringUserName2=Request.LogonUserIdentity.Name;// Gives NT AUTHORITY\SYSTEMStringUserName3=Environment.UserName;// Gives SYSTEMstringUserName4=HttpContext.Current.User.Identity.Name;// Gives actual user logged on (as seen in <ASP:Login />)stringUserName5=System.Windows.Forms.SystemInformation.UserName;// Gives SYSTEMreturnUserName4;}
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 AsStringPublicReadOnlyPropertyCurrentUserAsStringGetIfString.IsNullOrEmpty(m_CurUser)ThenDim who AsSystem.Security.Principal.IIdentity=System.Security.Principal.WindowsIdentity.GetCurrent()If who IsNothingThen
m_CurUser =Environment.UserDomainName&"\" &Environment.UserNameElse
m_CurUser = who.NameEndIfEndIfReturn m_CurUser
EndGetEndProperty
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{publicstaticclassUserIdentity{// concept borrowed from // https://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity(v=vs.110).aspxpublicstaticstringGetUser(){IntPtr accountToken =WindowsIdentity.GetCurrent().Token;WindowsIdentity windowsIdentity =newWindowsIdentity(accountToken);return windowsIdentity.Name;}}}
Holen Sie sich den aktuellen Windows-Benutzernamen:
using System;classSample{publicstaticvoidMain(){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.
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.
Environment.UserName
?Environment.UserName
gibt den Benutzer "RunAs" zurück.MessageBox.Show(Environment.UserName);
dies in Ihrewindow_loaded
Veranstaltung ein und führen Sie es mit RunAs aus.Domain\Username
. Wie kann ich den mit dem Benutzernamen verknüpften Namen erhalten?Wenn Sie sich in einem Netzwerk von Benutzern befinden, ist der Benutzername unterschiedlich:
eher, als
Wählen Sie das gewünschte Format.
quelle
Environment.UserDomainName + "\\" + Environment.UserName
, um scheinbar das gleiche Ergebnis wie zu erhaltenSystem.Security.Principal.WindowsIdentity.GetCurrent().Name
. Nun, was ist der Unterschied, fragst du ... Ich bin nicht sicher.System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
ToArray()
nachdemSplit
vor dem AufrufLast()
ToArray()
wird benötigt. Du würdest es aber brauchenusing System.Linq;
.Probieren Sie die Eigenschaft :
Environment.UserName
.quelle
string userName = Environment.UserName;
Environment.UsernName
gibt er den angemeldeten Kontonamen an, gibt jedoch den Kontonamen zurückWindowsIdentity.GetCurrent().Name
, unter dem die Anwendung ausgeführt wird.Die Dokumentation für Environment.UserName scheint etwas widersprüchlich zu sein:
Environment.UserName-Eigenschaft
Auf derselben Seite steht:
UND
Wenn Sie Environment.UserName mit RunAs testen, erhalten Sie den Namen des RunAs-Benutzerkontos und nicht den ursprünglich bei Windows angemeldeten Benutzer.
quelle
Ich stimme den anderen Antworten völlig zu, möchte aber noch eine Methode hervorheben, die besagt
Die obige Methode gab mir den Benutzernamen im Format zurück: DomainName \ UserName . Zum Beispiel EUROPE \ UserName
Welches unterscheidet sich von:
Welche im Format angezeigt: UserName
Und schlussendlich:
Dies ergab:
NT AUTHORITY\IUSR
(während die Anwendung auf einem IIS-Server ausgeführt wird) undDomainName\UserName
(während die Anwendung auf einem lokalen Server ausgeführt wird).quelle
Request
funktioniert nur, wenn Sie eine Webanwendung sind. Es ist eine Instanz vonSystem.Web.HttpRequest
Verwenden:
Das ist der Anmeldename.
quelle
Möglicherweise möchten Sie auch Folgendes verwenden:
So was...:
Hoffe das war hilfreich.
quelle
Ich habe verschiedene Kombinationen aus vorhandenen Antworten ausprobiert, aber sie gaben mir
Am Ende habe ich verwendet
Das gab mir nur den tatsächlichen Benutzernamen der Domain.
quelle
Dadurch erhalten Sie eine Ausgabe - Ihren_Benutzernamen
quelle
Verwenden Sie diese Option
System.Windows.Forms.SystemInformation.UserName
für den tatsächlich angemeldeten Benutzer, daEnvironment.UserName
das vom aktuellen Prozess verwendete Konto weiterhin zurückgegeben wird.quelle
Nur für den Fall, dass jemand wie ich nach dem Anzeigenamen des Benutzers im Gegensatz zum Benutzernamen sucht .
Hier ist der Leckerbissen:
Fügen Sie
System.DirectoryServices.AccountManagement
in Ihrem Projekt einen Verweis auf hinzu .quelle
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:
Hier ist eine kleine Funktion, die ich geschrieben habe, um sie alle auszuprobieren. Mein Ergebnis ist in den Kommentaren nach jeder Zeile.
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.
quelle
Hier ist der Code (aber nicht in C #):
Hier ist der Code (jetzt auch in C #):
quelle
Versuche dies
jetzt sieht es besser aus
quelle
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.
quelle
Holen Sie sich den aktuellen Windows-Benutzernamen:
quelle
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().Name
aber am Ende habe ich verwendetEnvironment.UserName;
, um den angemeldeten Windows-Benutzer und ohne den Domain-Teil zu bekommen.quelle
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
quelle