2009-08-06 22 views

Odpowiedz

674
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 
+71

Czym to się różni od 'Environment.UserName'? –

+4

to nie zadziała w Windows 8, jakikolwiek pomysł? –

+0

To pytanie jest już omówione w tym linku ...... może być powtórzonym pytaniem. http://stackoverflow.com/questions/5218778/how-to-get-currently-logged-username- from-windows-service-in-net –

96

Wypróbuj usługę: Environment.UserName.

+4

Lub 'ciąg userName = Environment.UserName;' – Donut

+6

Uwaga: jak Simon Gillbee wspomniany w komentarzach zaakceptowanej odpowiedzi, 'Environment.UsernName' podaje Zalogowano nazwę-konta, ale 'WindowsIdentity.GetCurrent(). Nazwa' zwraca nazwę konta, z powodu której aplikacja działa jako. – Gerwald

+3

@leo: Caution: Ta informacja jest również pozornie niepoprawna, patrz [Odpowiedź Bolu] (http://stackoverflow.com/questions/1240373/how-do-i-get-the-current-username-in-net-using -C# comment34794502_1240379). :-) –

20

Zastosowanie:

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

To będzie nazwa logowania.

+0

Nie, jeśli wątek jest uruchomiony w trybie podwyższonym. – maxp

9

Można również spróbować użyć:

Environment.UserName; 

tak ...:

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

Nadzieja to był pomocny.

243

Jeśli jesteś w sieci użytkowników, to nazwa będzie inna:

Environment.UserName 
- Will Display format : 'Username' 

zamiast

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

Wybierz żądany format.

+5

Możesz użyć 'Environment.UserDomainName +" \\ "+ Environment.UserName", aby uzyskać pozornie taki sam wynik jak 'System.Security.Principal.WindowsIdentity.GetCurrent(). Name'.Teraz, jaka jest różnica, pytasz ... Nie jestem pewien. – Gutblender

+6

Potrzebowałem, aby użytkownik uruchamiał 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(); ' – thehelix

+0

Musisz dodać' ToArray() 'po' Split' przed wywołaniem 'Last()' – codenamezero

21

Dokumentacja Environment.UserName wydaje się być trochę konflikt:

Environment.UserName Property

na tej samej stronie jest napisane:

Pobiera nazwę użytkownika osoby, która jest aktualnie zalogowany do systemu operacyjnego Windows.

I

Wyświetla nazwę użytkownika osoby, która rozpoczęła bieżący wątek

Jeśli przetestować Environment.UserName użyciu RunAs, to daje nazwę konta użytkownika Runas nie użytkownik pierwotnie zalogowany do systemu Windows.

7

Należy użyć System.Windows.Forms.SystemInformation.UserName dla faktycznie zalogowanego użytkownika jako Environment.UserName nadal zwraca konto używane przez bieżący proces.

+0

Dziękujemy za udostępnienie, zobacz także: System.Windows .Forms.SystemInformation.UserDomainName –

4

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 także w języku 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; 
    } 
} 
9

Próbowałem kilka kombinacji z istniejących odpowiedzi, ale dawali mi

DefaultAppPool 
IIS APPPOOL 
IIS APPPOOL\DefaultAppPool 

skończyło się używając

string vUserName = User.Identity.Name; 

Które dały mi tylko rzeczywistą nazwę użytkownika domeny użytkownika.

+0

Doskonały. Otrzymałem również tożsamość puli aplikacji. Ale twój kod rozwiązał mój problem. Dziękuję bardzo. – SuryaKavitha

+0

Wygląda na to, że chciałeś podać nazwę użytkownika, który wysyła żądanie, czyli do kontrolera MVC lub Web API. To różni się od nazwy użytkownika, której proces przebiega pod numerem –

+0

@BenAaronson Pytanie nic nie mówi o tym, jaka nazwa użytkownika uruchamia proces. Potrzebowałem aktualnie zalogowanej nazwy użytkownika domeny i wyszukiwanie przyniosło mi tę stronę, ten kod zakończył się dając mi to, czego potrzebowałem. –

20

bym całkowicie drugie inne odpowiedzi, ale chciałbym podkreślić jeszcze jedną metodę, która mówi

String UserName = Request.LogonUserIdentity.Name; 

Powyższa metoda wróciła mi nazwę użytkownika w formacie: NazwaDomeny \ nazwa_użytkownika. Na przykład EUROPE \ nazwa_użytkownika

który różni się od:

String UserName = Environment.UserName; 

jakim wyświetlane w formacie: nazwa_użytkownika

I wreszcie:

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

który dał: NT AUTHORITY\IUSR (podczas uruchamiania aplikacji na serwerze IIS) i DomainName\UserName (podczas uruchamiania aplikacji w lokalnym systemie erver).

1

Pobierz aktualną nazwę użytkownika Windows:

using System; 

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

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

Moja strona używa IIS, ale kiedy odwiedzam stronę z innego komputera w sieci, widzę "Network Service" jako nazwę użytkownika. Próbowałem wszystkich różnych opcji, ale nie daje mi to zalogowanego użytkownika, który przegląda stronę. Dowolny pomysł? – Si8

4

próbowałam wszystkie poprzednie odpowiedzi i znaleźć odpowiedź na MSDN po żaden z nich pracował dla mnie. Zobacz "UserName4" dla prawidłowego dla mnie.

Jestem po zalogowany użytkownik, jak wyświetlane przez:

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

Oto mały funkcja pisałem spróbować ich wszystkich. Mój wynik jest 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 przez return.

Aktualizacja: Chciałbym zaznaczyć, że uruchomienie tego kodu na mojej instancji serwera lokalnego pokazuje mi, że Username4 zwraca "" (pusty ciąg), ale nazwa użytkownika 3 i nazwa użytkownika 5 zwracają zalogowanego użytkownika. Po prostu coś, na co należy zwrócić uwagę.

+0

Moja strona używa IIS, ale kiedy odwiedzam stronę z innego komputera w sieci, widzę "Network Service" jako nazwę użytkownika. Próbowałem wszystkich różnych opcji, ale nie daje mi to zalogowanego użytkownika, który przegląda stronę. Dowolny pomysł? – Si8

+2

UWAGA: Nie jest to jasne, ale powyższy przykład dotyczy kontekstu aplikacji WWW działającej w IIS, gdzie kilka z nich wyświetli nazwę konta Windows Server, 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 uruchamiany jest ten proces. –

2

W przypadku aplikacji Windows Forms, która miała być dystrybuowana do wielu użytkowników, z których wielu zalogowało się za pośrednictwem VPN, wypróbowałem kilka sposobów, które wszystkie zadziałały dla mojego lokalnego testowania maszyny, ale nie dla innych. Natknąłem się na artykuł Microsoftu, który zaadaptowałem i działa.

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

spróbować

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

1

Tylko w przypadku, gdy ktoś szuka użytkownika Display Name w przeciwieństwie do Nazwa Użytkownika, jak ja .

Oto gratka:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

Add Reference do System.DirectoryServices.AccountManagement w projekcie.

Powiązane problemy