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

时间:2010-10-28 06:16:18

标签: c# login

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

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

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

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#中使用?

4 个答案:

答案 0 :(得分:6)

我认为只需将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());
            }

答案 1 :(得分:5)

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

您需要查看的Win32 API,可能需要GetProcessWindowStationGetUserObjectSecurity才能找到所有者。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您需要会话的用户名。您可以致电ProcessIdToSessionId找到您的会话ID。然后使用WTSQuerySessionInformation找出用户名。