2010-07-04 10 views
36

.NET에서 현재 Windows 사용자 이름을 가져 오는 방법은 여러 가지가 있습니다. 세 가지가 있습니다 :Windows 사용자 이름 가져 오기 - 다른 방법

string name = WindowsIdentity.GetCurrent().Name; 

또는

string name = Thread.CurrentPrincipal.Identity.Name; 

이나 차이가 무엇

string name = Environment.UserName; 

, 왜 다른 통해 하나의 방법을 선택? 다른 방법이 있습니까?

+0

무엇 System.Threading.Thread.CurrentPrincipal.Identity.Name''에 대해? –

+1

@ marc_s : 제안을 추가했습니다. – Andy

답변

31

Environment.UserName은 advapi32.dll 내의 GetUserName을 호출합니다. 즉, 다른 사용자로 가장하는 경우이 속성에 반영됩니다.

Thread.CurrentPrincipal에는 설정자가 있으며 프로그래밍 방식으로 변경할 수 있습니다. (이것은 가장이 아닙니다.)

WindowsIdentity는 현재 windows ID (있는 경우)입니다. 반드시 FormsAuthentication으로 ASP.NET을 생각하면 사용자를 반영하지는 않습니다. 그러면 WindowsIdentity는 NT 서비스가되지만 FormsIdentity는 로그인 한 사용자가됩니다. 또한 PassportIdentity가 있으며 사물을 더 복잡하게 만들 수 있습니다.

으로 HttpContext = HttpContext.Current.User, 현재 웹 요청에 대한 보안 정보를 포함하는 IPrincipal 개체를 반환 :

+0

"실행 방식 ..."을 통해 무언가를 실행하는 경우 "가장 (impersonation)"이란 의미입니까? – Andy

+0

@Andy, 나는 그것을 시험해 보았습니다. 그러나 WindowsIdentity 클래스에는 Impersonate() 메서드가 있으며 _it_가 가장을 수행 할 것이라고 확신합니다. ;) – sisve

0

나는이 속성이 프로그래머가 쉽게 찾을 수 있도록 몇 군데에 배치되었다고 생각합니다. 로그인 한 사용자는 하나 뿐이며 각각의 이름은 하나뿐입니다.

+0

따라서 이러한 모든 방법은 상호 교환이 가능합니까? – Andy

+0

나는 그렇다고 믿는다. 나는 여기서 미묘한 차이점을 기대하지 않을 것이다. –

1

다른 방법을 요청했습니다.

물론 Windows 고유 API 인 GetUserName을 사용할 수 있습니다.

0

세 가지 방법은 다음과 같이 설명되어 있습니다. 이것은 인증 된 웹 클라이언트입니다.

WindowsIdentity = WindowsIdentity.GetCurrent() : 현재 실행중인 Win32 스레드의 보안 컨텍스트 ID를 반환합니다.

Thread = Thread.CurrentPrincipal 현재 실행중인 .NET 스레드의 주체를 반환하며 Win32 스레드 맨 위에 놓입니다.

그리고이 문서에 설명 된대로 그들은 당신의 IIS 구성에 따라 결과의 변화 : http://msdn.microsoft.com/en-us/library/aa302377.aspx

관련 문제