C#을 사용하여 .NET에서 현재 사용자 이름을 가져오려면 어떻게 해야 합니까?
C#을 사용하여 .NET에서 현재 사용자 이름을 가져오려면 어떻게 해야 합니까?
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
사용자 네트워크에 있는 경우 사용자 이름이 다릅니다.
Environment.UserName
- Will Display format : 'Username'
보다는
System.Security.Principal.WindowsIdentity.GetCurrent().Name
- Will Display format : 'NetworkName\Username'
원하는 형식을 선택합니다.
속성을 사용해 보십시오.
환경에 대한 설명서입니다.UserName이(가) 약간 충돌하는 것 같습니다.
같은 페이지에 다음과 같이 나와 있습니다.
현재 Windows 운영 체제에 로그온되어 있는 사용자의 사용자 이름을 가져옵니다.
그리고.
현재 스레드를 시작한 사용자의 사용자 이름을 표시합니다.
환경을 테스트하는 경우.RunAs를 사용하는 UserName(사용자 이름)은 원래 Windows에 로그온한 사용자가 아닌 RunAs 사용자 계정 이름을 제공합니다.
저는 다른 답변에 전적으로 동의하지만, 다음과 같은 한 가지 방법을 더 강조하고 싶습니다.
String UserName = Request.LogonUserIdentity.Name;
위의 방법은 다음 형식으로 사용자 이름을 반환했습니다.도메인 이름\사용자 이름.예: EUROPE\UserName
다음과 다른 항목:
String UserName = Environment.UserName;
다음 형식으로 표시됩니다.사용자 이름
그리고 마지막으로:
String UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
이것은 다음을 제공했습니다.NT AUTHORITY\IUSR
서버에서 프로그램을 ) 및 (IIS 서버서을램실행는동하안그로)DomainName\UserName
(로컬 서버에서 응용프로그램을 실행하는 동안).
사용:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
로그온 이름이 됩니다.
나처럼 사용자 이름이 아닌 사용자 표시 이름을 찾는 경우.
자, 한턱 내겠습니다.
System.Directory Services.계정 관리.사용자 주체.현재의.표시 이름
System.DirectoryServices.AccountManagement
당신의 프로젝트에서.
String myUserName = Environment.UserName
출력이 표시됩니다. - your_user_name
다음을 사용해 볼 수도 있습니다.
Environment.UserName;
이렇게...:
string j = "Your WindowsXP Account Name is: " + Environment.UserName;
이것이 도움이 되었기를 바랍니다.
기존 답변에서 몇 가지 조합을 시도했지만, 해당 답변에서 제공되었습니다.
DefaultAppPool
IIS APPPOOL
IIS APPPOOL\DefaultAppPool
사용하게 되었습니다.
string vUserName = User.Identity.Name;
그것은 나에게 실제 사용자 도메인 사용자 이름만 주었습니다.
사용하다System.Windows.Forms.SystemInformation.UserName
"" " " " " " 로 로그인했습니다.Environment.UserName
현재 프로세스에서 사용 중인 계정을 여전히 반환합니다.
저는 이전의 모든 답변을 시도해 보았지만, 이것들 중 어느 것도 저에게 효과가 없었기 때문에 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는 로그인한 사용자를 반환합니다.그냥 조심해야 할 것.
이것을 먹어보세요.
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];
이제는 더 좋아 보입니다.
코드는 다음과 같습니다(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;
}
}
여러 사용자에게 배포될 Windows Forms 앱(대부분 vpn을 통해 로그인함)의 경우 로컬 기계 테스트에는 효과가 있지만 다른 사용자에게는 효과가 없는 여러 방법을 시도했습니다.저는 제가 수정하고 작업한 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;
}
}
}
현재 Windows 사용자 이름 가져오기:
using System;
class Sample
{
public static void Main()
{
Console.WriteLine();
// <-- Keep this information secure! -->
Console.WriteLine("UserName: {0}", Environment.UserName);
}
}
저는 여기서 대부분의 답을 검토했지만, 그 중 어느 것도 저에게 맞는 사용자 이름을 알려주지 않았습니다.
저의 경우 Shift+오른쪽 버튼으로 파일을 클릭하고 "다른 사용자로 실행"하는 등 다른 사용자의 앱을 실행하면서 로그인한 사용자 이름을 얻고 싶었습니다.
제가 시도한 답은 '다른' 사용자 이름을 주었습니다.
이 블로그 게시물은 로그인한 사용자 이름을 가져오는 방법을 제공하며, 이는 내 시나리오에서도 작동합니다.
https://smbadiwe.github.io/post/track-activities-windows-service/
Wtsapi를 사용합니다.
편집: 블로그 게시물의 필수 코드는, 그것이 사라질 경우를 대비하여,
ServiceBase에서 상속되는 클래스에 이 코드 추가
[DllImport("Wtsapi32.dll")]
private static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WtsInfoClass wtsInfoClass, out IntPtr ppBuffer, out int pBytesReturned);
[DllImport("Wtsapi32.dll")]
private static extern void WTSFreeMemory(IntPtr pointer);
private enum WtsInfoClass
{
WTSUserName = 5,
WTSDomainName = 7,
}
private static string GetUsername(int sessionId, bool prependDomain = true)
{
IntPtr buffer;
int strLen;
string username = "SYSTEM";
if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSUserName, out buffer, out strLen) && strLen > 1)
{
username = Marshal.PtrToStringAnsi(buffer);
WTSFreeMemory(buffer);
if (prependDomain)
{
if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSDomainName, out buffer, out strLen) && strLen > 1)
{
username = Marshal.PtrToStringAnsi(buffer) + "\\" + username;
WTSFreeMemory(buffer);
}
}
}
return username;
}
생성자가 아직 없는 경우 클래스에 생성자를 추가하고 다음 행을 추가합니다.
CanHandleSessionChangeEvent = true;
편집: 의견 요청별로 세션 ID(활성 콘솔 세션 ID)를 가져오는 방법은 다음과 같습니다.
[DllImport("kernel32.dll")]
private static extern uint WTSGetActiveConsoleSessionId();
var activeSessionId = WTSGetActiveConsoleSessionId();
if (activeSessionId == INVALID_SESSION_ID) //failed
{
logger.WriteLog("No session attached to console!");
}
다른 사람들에게 도움이 될 경우를 대비하여, 앱을 c#.net 3.5 app에서 Visual Studio 2017로 업그레이드했을 때 이 코드 라인User.Identity.Name.Substring(4);
startIndex는 문자열 길이보다 클 수 없습니다(이전에는 book하지 않았습니다).
로 바꿨을 때 행복했습니다.System.Security.Principal.WindowsIdentity.GetCurrent().Name
하지만 사용하게 되었습니다.Environment.UserName;
도메인 부분 없이 로그인한 Windows 사용자를 가져옵니다.
언급URL : https://stackoverflow.com/questions/1240373/how-do-i-get-the-current-username-in-net-using-c
'programing' 카테고리의 다른 글
가 비어 있는지 확인하는 방법은 무엇입니까? (앵글 2+에서 지금까지) (0) | 2023.05.24 |
---|---|
Express에서 "?" 다음에 GET 매개 변수에 액세스하는 방법은 무엇입니까? (0) | 2023.05.24 |
PostgreSQL: ERROR: 연산자가 존재하지 않습니다. 정수 = 문자가 다양합니다. (0) | 2023.05.24 |
잘못된 작업예외:어셈블리에서 'UserSecretsIdAttribute'를 찾을 수 없습니다. (0) | 2023.05.24 |
산란 과정의 자식이 되지 않고 새로운 과정을 시작합니다. (0) | 2023.05.24 |