C #을 사용하여 .NET에서 현재 사용자 이름을 얻는 방법은 무엇입니까?


606

C #을 사용하여 .NET에서 현재 사용자 이름을 얻는 방법은 무엇입니까?

답변:


897
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

96
이것과 어떻게 Environment.UserName다릅니 까?
Sam Harwell

59
@SimonGillbee, 이것이 잘못되었습니다 Environment.UserName. "RunAs"사용자를 반환합니다.
Bolu

5
확인하려면 .... 이벤트 MessageBox.Show(Environment.UserName);에 이것을 넣고 window_loadedRunAs ...를 사용하여 실행하십시오.
Bolu


4
이 반환합니다 Domain\Username. 사용자 이름과 관련된 이름을 얻으려면 어떻게해야합니까?
SearchForKnowledge

325

사용자 네트워크에 있다면 사용자 이름이 달라집니다.

Environment.UserName
- Will Display format : 'Username'

오히려

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

원하는 형식을 선택하십시오.


7
Environment.UserDomainName + "\\" + Environment.UserName겉보기와 동일한 결과를 얻는 데 사용할 수 있습니다 System.Security.Principal.WindowsIdentity.GetCurrent().Name. 자, 차이점은 무엇입니까, 묻습니다 ... 잘 모르겠습니다.
Gutblender

9
로그인 한 사용자가 아닌 사용자가 앱을 실행하도록해야했습니다 (Environment.UserName은 내가 원하는 것이 아닙니다). 도메인을 제거하기 위해 다음을 수행했습니다. System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split( '\\' ).Last();
thehelix

당신은 추가해야합니다 ToArray()Split호출하기 전에Last()
codenamezero

1
@codenamezero 아니오 ToArray()가 필요합니다. using System.Linq;그래도 필요합니다 .
TheSoftwareJedi

112

속성을 사용해보십시오 : Environment.UserName.


5
또는string userName = Environment.UserName;
Donut

10
주의 : 허용 된 답변의 설명에 언급 된 Simon Gillbee와 같이 Environment.UsernName로그인 한 계정 이름을 제공하지만 WindowsIdentity.GetCurrent().Name응용 프로그램이 실행중인 계정 이름을 반환합니다.
Gerwald

5
@leo :주의 :이 정보도 명백히 틀 렸습니다. Bolu의 답변을 참조하십시오 . :-)
TJ Crowder

ASP.NET과 함께 사용하지 마십시오. docs.microsoft.com은 다음과 같이 말합니다. "ASP.NET 응용 프로그램이 개발 환경에서 실행되는 경우 UserName 속성은 현재 사용자의 이름을 반환합니다. 게시 된 ASP.NET 응용 프로그램에서는이 속성이 응용 프로그램 풀 계정의 이름 ( (예 : Default AppPool). "
feihoa

28

Environment.UserName에 대한 문서는 약간 충돌하는 것 같습니다.

Environment.UserName 속성

같은 페이지에 다음과 같이 표시됩니다.

현재 Windows 운영 체제에 로그온 한 사람의 사용자 이름을 가져옵니다.

현재 스레드를 시작한 사람의 사용자 이름을 표시합니다

RunAs를 사용하여 Environment.UserName을 테스트하면 처음에 Windows에 로그온 한 사용자가 아닌 RunAs 사용자 계정 이름이 제공됩니다.


24

다른 답변은 완전히 두 번째이지만, 한 가지 방법을 강조하고 싶습니다.

String UserName = Request.LogonUserIdentity.Name;

위의 메소드는 사용자 이름을 DomainName \ UserName 형식으로 반환했습니다 . 예를 들어, EUROPE \ UserName

다음과는 다릅니다.

String UserName = Environment.UserName;

다음 형식으로 표시됩니다 : UserName

그리고 마지막으로:

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

이는 주었다 NT AUTHORITY\IUSR(IIS 서버에서 응용 프로그램을 실행하는 동안) 및 DomainName\UserName(로컬 서버에서 응용 프로그램을 실행하는 동안).


"요청"을 사용하려면 어떤 네임 스페이스가 필요합니까?
TK-421

1
@ TK-421 Request은 웹 응용 프로그램 인 경우에만 작동합니다. 그것은의 인스턴스입니다System.Web.HttpRequest
제라르 Grignoli

22

사용하다:

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

로그온 이름이됩니다.


11

다음을 사용하려고 할 수도 있습니다.

Environment.UserName;

이것처럼 ... :

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

이것이 도움이 되었기를 바랍니다.


11

기존 답변에서 여러 조합을 시도했지만 그들은 나에게주는

DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool

나는 사용했다

string vUserName = User.Identity.Name;

실제 사용자 도메인 사용자 이름 만 제공했습니다.


우수한. 또한 앱 풀 ID 만 받았습니다. 그러나 코드가 내 문제를 해결했습니다. 정말 고맙습니다.
SuryaKavitha

요청하는 사용자의 사용자 이름을 원했던 것처럼 들립니다 .MVC 또는 웹 API 컨트롤러에 추측합니다. 프로세스가 실행되는 사용자 이름과 다릅니다.
Ben Aaronson

@ BenAaronson이 질문은 어떤 사용자 이름이 프로세스를 실행하고 있는지에 대해 아무 말도하지 않습니다. 현재 로그인 한 도메인 사용자 이름이 필요했고 검색으로 인해이 페이지로 연결되었습니다.이 코드는 결국 필요한 정보를 제공했습니다.
Daniel E.

11
String myUserName = Environment.UserName

이것은 당신에게 출력을 줄 것입니다 -your_user_name


9

사용 System.Windows.Forms.SystemInformation.UserName으로 실제 로그인 한 사용자에 대해 Environment.UserName여전히 현재 프로세스에 의해 사용되는 계정을 반환합니다.


공유해 주셔서 감사합니다. 또한 다음을 참조하십시오 : System.Windows.Forms.SystemInformation.UserDomainName
Ashish Singh

9

누군가 나처럼 User Name 과 달리 User Display Name 을 찾고있는 경우 를 대비하여 .

치료법은 다음과 같습니다.

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

System.DirectoryServices.AccountManagement프로젝트에 참조를 추가하십시오 .


6

나는 이전의 모든 대답을 시도했지만 이것들이 저에게 도움이되지 않은 후에 MSDN에서 답을 찾았습니다. 나에게 맞는 것은 'UserName4'를 참조하십시오.

다음과 같이 로그인 한 사용자 다음 에 표시됩니다.

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

여기에 그것들을 모두 시험해보기 위해 작성한 작은 기능이 있습니다. 내 결과는 각 행 뒤에 주석에 있습니다.

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

이 함수를 호출하면 로그인 한 사용자 이름이 반환됩니다.

업데이트 : 로컬 서버 인스턴스 에서이 코드를 실행하면 Username4가 ""(빈 문자열)를 반환하지만 UserName3 및 UserName5는 로그인 한 사용자를 반환한다는 것을 나타냅니다. 조심해야 할 것.


내 웹 사이트에서 IIS를 사용하고 있지만 네트워크 내의 다른 컴퓨터에서 페이지를 방문하면 "네트워크 서비스"가 사용자 이름으로 계속 표시됩니다. 다른 옵션을 모두 시도했지만 페이지를보고있는 로그인 한 사용자에게 제공하지 않습니다. 어떤 생각?
Si8

3
참고 : 명확하지는 않지만 위의 예제는 IIS에서 실행되는 웹 응용 프로그램의 컨텍스트에 적용되며 그 중 일부는 ASP.Net 응용 프로그램 풀을 실행하는 서버 Windows 계정의 이름을 표시합니다. 대화식 프로그램 또는 Windows 서비스로 실행중인 경우 HttpContext의 서비스를 사용할 수 없으며 다른 서비스 중 하나를 사용하여 프로세스가 실행되는 계정을 찾으십시오.
Oskar Berggren

4

코드는 다음과 같습니다 (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

다음은 코드입니다 (현재 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;
    }
}


4

이 시도

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];

이제 더 좋아 보인다


3

현재 Windows 사용자 이름을 가져옵니다.

using System;

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

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

내 웹 사이트에서 IIS를 사용하고 있지만 네트워크 내의 다른 컴퓨터에서 페이지를 방문하면 "네트워크 서비스"가 사용자 이름으로 계속 표시됩니다. 다른 옵션을 모두 시도했지만 페이지를보고있는 로그인 한 사용자에게 제공하지 않습니다. 어떤 생각?
Si8

2

VPN을 통해 로그인하는 여러 사용자에게 배포 될 Windows Forms 앱의 경우 로컬 컴퓨터 테스트에는 효과가 있지만 다른 컴퓨터에는 효과가없는 여러 가지 방법을 시도했습니다. 내가 적응하고 작동하는 Microsoft 기사를 발견했습니다.

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

1

다른 사람들에게 도움이되는 경우 c # .net 3.5 앱에서 Visual Studio 2017으로 앱을 업그레이드 할 때이 코드 줄에서 User.Identity.Name.Substring(4);" startIndex는 문자열 길이보다 클 수 없습니다 "라는 오류가 발생 했습니다 (이전에는 멍청하지 않았습니다).

내가 그것을 변경했을 때 행복 System.Security.Principal.WindowsIdentity.GetCurrent().Name했지만 Environment.UserName;도메인 부분없이 Windows 사용자에 로그인 하는 데 사용 했습니다.


감사합니다 @doreen 유용합니다.
Shivam Bharadwaj

0

나는 대부분의 답변을 여기에서 보았고 그들 중 누구도 올바른 사용자 이름을주지 못했습니다.

필자의 경우 파일을 Shift + 마우스 오른쪽 버튼으로 클릭하고 "다른 사용자로 실행"과 같이 다른 사용자로부터 내 앱을 실행하는 동안 로그인 한 사용자 이름을 얻으려고했습니다.

내가 시도한 답변은 나에게 '다른'사용자 이름을 부여했습니다.

이 블로그 게시물은 로그인 한 사용자 이름을 얻는 방법을 제공합니다.이 시나리오는
https://smbadiwe.github.io/post/track-activities-windows-service/

Wtsapi를 사용합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.