在C#中获取登录的用户名

如何获取Windows 7中当前登录的用户名(即物理登录到我正在启动的程序正在运行的控制台的用户)。

例如,如果我以“MainUser”身份登录并运行我的控制台应用程序(将显示登录的用户名)作为“SubUser”,则程序仅返回“SubUser”作为当前登录的用户。

我使用以下两种技术来获取用户名。 两者都没有让我得到我想要的东西。

System.Environment.GetEnvironmentVariable("USERNAME") System.Security.Principal.WindowsIdentity.GetCurrent().User; 

但请注意,无论运行此脚本的用户帐户如何,此VBScript代码都会返回登录的用户名:

 strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set compsys_arr = objWMIService.ExecQuery _ ("Select * from Win32_ComputerSystem") For Each sys in compsys_arr Wscript.Echo "username: " & sys.UserName Next 

在C#中有什么可能吗?

我认为只需将WMI调用转换为c#就可以了。

  ConnectionOptions oConn = new ConnectionOptions(); System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\\\localhost", oConn); System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select * from Win32_ComputerSystem"); ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery); ManagementObjectCollection oReturnCollection = oSearcher.Get(); foreach (ManagementObject oReturn in oReturnCollection) { Console.WriteLine(oReturn["UserName"].ToString().ToLower()); } 

我认为你必须走P / Invoke路线。 您需要找出正在运行的WindowStation,然后确定该WindowStation的所有者。 我认为没有用于确定这些东西的.NET API。

您需要查看的Win32 API可能是GetProcessWindowStation和GetUserObjectSecurity来查找所有者。

Altough我不明白你是否想要获取用户名,谁登录系统或运行控制台的用户名 – 也许你可以尝试使用System.Environment.UserName – MSDN声称它显示已记录在用户名上。

您需要会话的用户名。 您可以通过调用ProcessIdToSessionId找到您的会话ID。 然后使用WTSQuerySessionInformation查找用户名。