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();
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:
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.
Ś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.
Użyj System.Windows.Forms.SystemInformation.UserNamedla faktycznie zalogowanego użytkownika, ponieważ Environment.UserNamenadal zwraca konto używane przez bieżący proces.
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.
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;}
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 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
Uzyskaj aktualną nazwę użytkownika systemu Windows:
using System;classSample{publicstaticvoidMain(){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{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;}}}
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.
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.
Environment.UserName
?Environment.UserName
zwróci użytkownika „RunAs”.MessageBox.Show(Environment.UserName);
umieść to w swoimwindow_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:
zamiast
Wybierz żądany format.
źródło
Environment.UserDomainName + "\\" + Environment.UserName
aby uzyskać pozornie taki sam wynik jakSystem.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. Potrzebujeszusing System.Linq;
jednak.Spróbuj właściwość:
Environment.UserName
.źródło
string userName = Environment.UserName;
Environment.UsernName
podaje nazwę zalogowanego konta, aleWindowsIdentity.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:
I
Jeśli przetestujesz Environment.UserName przy użyciu RunAs, otrzymasz nazwę konta użytkownika RunAs, a nie użytkownika pierwotnie zalogowanego do systemu Windows.
źródło
Całkowicie popieram pozostałe odpowiedzi, ale chciałbym podkreślić jeszcze jedną metodę, która mówi
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:
Które wyświetlane w formacie: nazwa użytkownika
I w końcu:
co dało:
NT AUTHORITY\IUSR
(podczas uruchamiania aplikacji na serwerze IIS) iDomainName\UserName
(podczas uruchamiania aplikacji na serwerze lokalnym).źródło
Request
działa tylko wtedy, gdy jesteś aplikacją internetową. Jest to przykładSystem.Web.HttpRequest
Posługiwać się:
To będzie nazwa logowania.
źródło
Możesz także spróbować użyć:
Lubię to...:
Mam nadzieję, że to było pomocne.
źródło
Próbowałem kilku kombinacji z istniejących odpowiedzi, ale one mi dawały
Skończyło się na tym
Co dało mi rzeczywistą nazwę użytkownika domeny tylko dla użytkowników.
źródło
To da ci wynik - twoja_nazwa_użytkownika
źródło
Użyj
System.Windows.Forms.SystemInformation.UserName
dla faktycznie zalogowanego użytkownika, ponieważEnvironment.UserName
nadal zwraca konto używane przez bieżący proces.źródło
Na wypadek, gdyby ktoś szukał nazwy wyświetlanej użytkownika w przeciwieństwie do nazwy użytkownika , takiej jak ja.
Oto uczta:
Dodaj odniesienie do
System.DirectoryServices.AccountManagement
w swoim projekcie.źródło
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:
Oto mała funkcja, którą napisałem, aby wypróbować je wszystkie. Mój wynik znajduje się w komentarzach po każdym wierszu.
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ć.
źródło
Oto kod (ale nie w C #):
Oto kod (teraz również w C #):
źródło
Spróbuj tego
teraz wygląda lepiej
źródło
Uzyskaj aktualną nazwę użytkownika systemu Windows:
źródło
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.
źródło
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.źródło
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
źródło