Development Tip

.NET의 Windows 서비스에서 현재 로그인 된 사용자 이름을 얻으려면 어떻게합니까?

yourdevel 2020. 12. 10. 21:25
반응형

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

참고 URL : https://stackoverflow.com/questions/5218778/how-do-i-get-the-currently-logged-username-from-a-windows-service-in-net

반응형