.NET의 Windows 서비스에서 현재 로그인 된 사용자 이름을 얻으려면 어떻게합니까?
현재 로그인 된 사용자 이름이 필요한 Windows 서비스가 있습니다. System.Environment.UserName
, Windows ID 및 Windows 양식 인증을 시도했지만 내 서비스가 시스템 권한이있는 시스템에서 실행 중이므로 모두 " 시스템 "을 사용자로 반환 합니다. 내 서비스 계정 유형을 변경하지 않고 현재 로그인 된 사용자 이름을 가져올 수있는 방법이 있습니까?
다음은 사용자 이름을 가져 오는 WMI 쿼리입니다.
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];
System.Management
참조에서 수동으로 추가해야합니다 .
사용자 네트워크에있는 경우 사용자 이름이 달라집니다.
Environment.UserName
표시 형식 : 대신 '사용자 이름'
System.Security.Principal.WindowsIdentity.GetCurrent().Name
표시 형식 : '네트워크 이름 \ 사용자 이름'
원하는 형식을 선택하십시오.
ManagementObjectSearcher ( "SELECT UserName FROM Win32_ComputerSystem") 솔루션이 잘 작동했습니다. 그러나 서비스가 원격 데스크톱 연결을 통해 시작되면 작동하지 않습니다. 이 문제를 해결하기 위해 항상 PC에서 실행되는 대화 형 프로세스 소유자의 사용자 이름 (explorer.exe)을 요청할 수 있습니다. 이렇게하면 항상 Windows 서비스에서 현재 Windows에 로그인 한 사용자 이름을 가져옵니다.
foreach (System.Management.ManagementObject Process in Processes.Get())
{
if (Process["ExecutablePath"] != null &&
System.IO.Path.GetFileName(Process["ExecutablePath"].ToString()).ToLower() == "explorer.exe" )
{
string[] OwnerInfo = new string[2];
Process.InvokeMethod("GetOwner", (object[])OwnerInfo);
Console.WriteLine(string.Format("Windows Logged-in Interactive UserName={0}", OwnerInfo[0]));
break;
}
}
Tapas의 답변 코드 수정 :
Dim searcher As New ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem")
Dim collection As ManagementObjectCollection = searcher.[Get]()
Dim username As String
For Each oReturn As ManagementObject In collection
username = oReturn("UserName")
Next
시도해보십시오 WindowsIdentity.GetCurrent()
. 다음에 대한 참조를 추가해야합니다.System.Security.Principal
시도해 볼 수도 있습니다.
System.Environment.GetEnvironmentVariable("UserName");
누군가가 나처럼 사용자 이름이 아닌 사용자 표시 이름 을 찾는 경우 를 대비하여 .
치료는 다음과 같습니다.
System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName.
System.DirectoryServices.AccountManagement
프로젝트에 참조를 추가하십시오 .
@xanblax의 답변 완성
private static string getUserName()
{
SelectQuery query = new SelectQuery(@"Select * from Win32_Process");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
{
foreach (System.Management.ManagementObject Process in searcher.Get())
{
if (Process["ExecutablePath"] != null &&
string.Equals(Path.GetFileName(Process["ExecutablePath"].ToString()), "explorer.exe", StringComparison.OrdinalIgnoreCase))
{
string[] OwnerInfo = new string[2];
Process.InvokeMethod("GetOwner", (object[])OwnerInfo);
return OwnerInfo[0];
}
}
}
return "";
}
'Development Tip' 카테고리의 다른 글
Android에서 메모리 사용량 얻기 (0) | 2020.12.10 |
---|---|
비디오 파일의 길이를 얻는 방법은 무엇입니까? (0) | 2020.12.10 |
다른 열에서 계산 된 열? (0) | 2020.12.10 |
Bash if 문에서 대괄호는 언제 필요합니까? (0) | 2020.12.10 |
NameError : 'reload'이름이 정의되지 않았습니다. (0) | 2020.12.10 |