Odpowiedzi:
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Environment.UserName
zwróci użytkownika „RunAs”.
MessageBox.Show(Environment.UserName);
umieść to w swoim window_loaded
zdarzeniu i uruchom za pomocą RunAs ....
Domain\Username
. Jak mogę uzyskać nazwę powiązaną z nazwą użytkownika?
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.
Environment.UserDomainName + "\\" + Environment.UserName
aby uzyskać pozornie taki sam wynik jak System.Security.Principal.WindowsIdentity.GetCurrent().Name
. Jaka jest różnica, pytasz ... Nie jestem pewien.
System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
ToArray()
po, Split
zanim zadzwoniszLast()
ToArray()
jest potrzebne. Potrzebujesz using System.Linq;
jednak.
Spróbuj właściwość: Environment.UserName
.
string userName = Environment.UserName;
Environment.UsernName
podaje nazwę zalogowanego konta, ale WindowsIdentity.GetCurrent().Name
zwraca nazwę konta, pod którą działa aplikacja.
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.
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).
Request
działa tylko wtedy, gdy jesteś aplikacją internetową. Jest to przykładSystem.Web.HttpRequest
Posługiwać się:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
To będzie nazwa logowania.
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.
String myUserName = Environment.UserName
To da ci wynik - twoja_nazwa_użytkownika
Użyj System.Windows.Forms.SystemInformation.UserName
dla faktycznie zalogowanego użytkownika, ponieważ Environment.UserName
nadal zwraca konto używane przez bieżący proces.
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.
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ć.
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;
}
}
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
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);
}
}
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;
}
}
}
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().Name
jednak skończyło się Environment.UserName;
na tym, że zalogowałem się w systemie Windows bez części domeny.
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
Environment.UserName
?