Antworten:
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Environment.UserName
gibt den Benutzer "RunAs" zurück.
MessageBox.Show(Environment.UserName);
dies in Ihre window_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:
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.
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.
System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
ToArray()
nachdem Split
vor dem AufrufLast()
ToArray()
wird benötigt. Du würdest es aber brauchen using System.Linq;
.
Probieren Sie die Eigenschaft : Environment.UserName
.
string userName = Environment.UserName;
Environment.UsernName
gibt er den angemeldeten Kontonamen an, gibt jedoch den Kontonamen zurück WindowsIdentity.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:
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.
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).
Request
funktioniert nur, wenn Sie eine Webanwendung sind. Es ist eine Instanz vonSystem.Web.HttpRequest
Verwenden:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
Das ist der Anmeldename.
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.
String myUserName = Environment.UserName
Dadurch erhalten Sie eine Ausgabe - Ihren_Benutzernamen
Verwenden Sie diese Option System.Windows.Forms.SystemInformation.UserName
für den tatsächlich angemeldeten Benutzer, da Environment.UserName
das vom aktuellen Prozess verwendete Konto weiterhin zurückgegeben wird.
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.AccountManagement
in Ihrem Projekt einen Verweis auf hinzu .
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.
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;
}
}
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
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;
}
}
}
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);
}
}
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 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.
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
Environment.UserName
?